我是这个网站的新手,并试图学习awk。我试图找到field5的最大值,按年份分组,还有几个月......
每个月(一年),只打印概率最大的行
输入文件:(以逗号分隔)
year,month,lat,lng,probability 0,0,40,331,1.00000 0,2,38,334,0.01111 0,2,38,334,0.05511 0,4,38,335,0.06667 0,8,38,336,0.16667 1,2,39,334,0.12222 1,2,39,335,0.04444 1,4,39,336,0.02222 1,4,40,333,0.14444 1,4,40,334,0.12222 2,6,40,335,0.06667 2,6,40,336,0.14444
所需的输出文件
months,lat,lng 2,38,334 4,38,335 8,38,336 14,40,333 16,40,336
谢谢大家的帮助
答案 0 :(得分:1)
您的示例中存在不一致之处。如果由' group'您的意思是由$1,$2
定义的组需要有多个条目,这解释了为什么0,40,331
未包含在内。但是为什么要包括4,38,335
?
无论如何,你要求开始,这里是:
$ awk 'BEGIN{FS=OFS=","}
NR==1{print $2,$3,$4; next}
NR==FNR && FNR>1 {
if ($5>max[$1 OFS $2]) max[$1 OFS $2]=$5
next
}
max[$1 OFS $2]==$5 { print $1*12+$2,$3,$4}
' file file
打印:
month,lat,lng
0,40,331
2,38,334
4,38,335
8,38,336
14,39,334
16,40,333
30,40,336
请注意,脚本遍历文件两次(在命令行上使用file
两次)。第一次是找到由$1,$2
定义的组的最大值,第二次是打印该行。
如果您只想包含群组,请计算:
$ awk 'BEGIN{FS=OFS=","}
NR==1{print $2,$3,$4; next}
NR==FNR && FNR>1 {
cnt[$1 OFS $2]++
if ($5>max[$1 OFS $2]) max[$1 OFS $2]=$5
next
}
max[$1 OFS $2]==$5 && cnt[$1 OFS $2]>1 { print $1*12+$2,$3,$4}
' file file
month,lat,lng
2,38,334
14,39,334
16,40,333
30,40,336
我承认这与您的示例不同,但我认为您的示例需要更多解释。
答案 1 :(得分:0)
谢谢大家,感谢@dawg的帮助
我想对我的最终代码提供反馈:
#!/bin/bash
awk 'BEGIN{FS=OFS=","}
NR==1{print "months",$3,$4; next}
NR==FNR && FNR>1 {
if ($5>max[$1,$2])
max[$1,$2]=$5
next
}
{if (max[$1,$2] == $5)
print $1*12+$2,$3,$4;}' example.csv example.csv `