awk 变量和 printf
awk variables and printf
我有这样一个 CSV 文件:
"Player","VPIP"
"$GIU","21.01"
"$VaSko$.017","14.11"
"*Lampiaao*","16.15"
"111bellbird","30.30"
"1221Vik1221","21.97"
"16266+626","20.83"
"17victor","16.09"
"1980locky","11.49"
"19dem","22.81"
"1lllllllllll","20.99"
......
我想在 (g)AWK 中将如下行打印到输出文件中,并从引号之间提取信息:
<note player="player ID comes here" label="a number between 0-7 based on the number belong to the player's VPIP value" update="this one is irrelevant, one nuber can be used for all the lines"></note>
所以打印的行看起来像这样:
<note player="17victor" label="2" update="1435260533"></note>
显然,我想在读取 CSV 文件时忽略第一行,因为它只包含 header 数据。标签编号标准为:
0: VPIP > 37.5
1: VPIP < 10
2:VPIP 在 10 - 16.5 之间
7:其余。
知道如何实现吗?
脚本
试试这个 awk 脚本:
BEGIN {
FS = ","
update = 34513135
}
NR != 1 {
vpip =
gsub(/"/, "", vpip)
if (vpip > 37.5)
label = 0
else if (vpip < 10)
label = 1
else if (vpip < 16.5)
label = 2
else
label = 7
printf "<note player=%s label=%s update=%s></note>\n", , label, update
}
说明
真的很简单:
- 首先我们将字段分隔符设置为逗号,这样输入文件每行有两个字段(即一条记录)。
- 我们还在
BEGIN
块中设置更新变量(这在解析文件之前执行。
- 然后我们对第一行以外的每一行执行下一段代码
NR != 1
。
- 这里我们将第二个字段设置为
vpip
并删除引号以将其与整数进行比较。
- 现在我们获取 VPIP 并将其映射到正确的标签,我们将其存储在
label
。
- 最终以所需格式打印该行。
用法
要使用此代码,您应该执行 awk -f script.awk file
。其中 script.awk
是脚本的名称,file
是输入文件的路径。
用法示例:
$ cat file
"Player","VPIP"
"$GIU","21.01"
"$VaSko$.017","14.11"
"*Lampiaao*","16.15"
"111bellbird","30.30"
"1221Vik1221","21.97"
"16266+626","20.83"
"17victor","16.09"
"1980locky","11.49"
"19dem","22.81"
"1lllllllllll","20.99"
$ awk -f script.awk file
<note player="$GIU" label=7 update=34513135></note>
<note player="$VaSko$.017" label=2 update=34513135></note>
<note player="*Lampiaao*" label=2 update=34513135></note>
<note player="111bellbird" label=7 update=34513135></note>
<note player="1221Vik1221" label=7 update=34513135></note>
<note player="16266+626" label=7 update=34513135></note>
<note player="17victor" label=2 update=34513135></note>
<note player="1980locky" label=2 update=34513135></note>
<note player="19dem" label=7 update=34513135></note>
<note player="1lllllllllll" label=7 update=34513135></note>
备注
如有其他问题,请留言,我会详细说明。
我有这样一个 CSV 文件:
"Player","VPIP"
"$GIU","21.01"
"$VaSko$.017","14.11"
"*Lampiaao*","16.15"
"111bellbird","30.30"
"1221Vik1221","21.97"
"16266+626","20.83"
"17victor","16.09"
"1980locky","11.49"
"19dem","22.81"
"1lllllllllll","20.99"
......
我想在 (g)AWK 中将如下行打印到输出文件中,并从引号之间提取信息:
<note player="player ID comes here" label="a number between 0-7 based on the number belong to the player's VPIP value" update="this one is irrelevant, one nuber can be used for all the lines"></note>
所以打印的行看起来像这样:
<note player="17victor" label="2" update="1435260533"></note>
显然,我想在读取 CSV 文件时忽略第一行,因为它只包含 header 数据。标签编号标准为:
0: VPIP > 37.5
1: VPIP < 10
2:VPIP 在 10 - 16.5 之间
7:其余。
知道如何实现吗?
脚本
试试这个 awk 脚本:
BEGIN {
FS = ","
update = 34513135
}
NR != 1 {
vpip =
gsub(/"/, "", vpip)
if (vpip > 37.5)
label = 0
else if (vpip < 10)
label = 1
else if (vpip < 16.5)
label = 2
else
label = 7
printf "<note player=%s label=%s update=%s></note>\n", , label, update
}
说明
真的很简单:
- 首先我们将字段分隔符设置为逗号,这样输入文件每行有两个字段(即一条记录)。
- 我们还在
BEGIN
块中设置更新变量(这在解析文件之前执行。 - 然后我们对第一行以外的每一行执行下一段代码
NR != 1
。 - 这里我们将第二个字段设置为
vpip
并删除引号以将其与整数进行比较。 - 现在我们获取 VPIP 并将其映射到正确的标签,我们将其存储在
label
。 - 最终以所需格式打印该行。
用法
要使用此代码,您应该执行 awk -f script.awk file
。其中 script.awk
是脚本的名称,file
是输入文件的路径。
用法示例:
$ cat file
"Player","VPIP"
"$GIU","21.01"
"$VaSko$.017","14.11"
"*Lampiaao*","16.15"
"111bellbird","30.30"
"1221Vik1221","21.97"
"16266+626","20.83"
"17victor","16.09"
"1980locky","11.49"
"19dem","22.81"
"1lllllllllll","20.99"
$ awk -f script.awk file
<note player="$GIU" label=7 update=34513135></note>
<note player="$VaSko$.017" label=2 update=34513135></note>
<note player="*Lampiaao*" label=2 update=34513135></note>
<note player="111bellbird" label=7 update=34513135></note>
<note player="1221Vik1221" label=7 update=34513135></note>
<note player="16266+626" label=7 update=34513135></note>
<note player="17victor" label=2 update=34513135></note>
<note player="1980locky" label=2 update=34513135></note>
<note player="19dem" label=7 update=34513135></note>
<note player="1lllllllllll" label=7 update=34513135></note>
备注
如有其他问题,请留言,我会详细说明。