使用groupby使用awk提取最大值和最小值

时间:2017-03-22 19:16:16

标签: awk max

我是这个网站的新手,并试图学习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  

谢谢大家的帮助

2 个答案:

答案 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 `