2017-03-22 87 views
-3

我是新来这个网站并试图学习awk。我试图找到字段5的最大值,通过多年的分组,并且还个月..使用awk通过groupby提取最大值和最小值

为每月(每年),印刷正好符合概率最大

输入文件: (逗号分隔)

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

的StackOverflow是没有剧本的写作服务。请显示你试过的东西 –

+0

我只需要有人来指导我,我从来没有要求完整的脚本 我的问题是,我不能写这两个组的脚本,按年份和按月份,我做了很多在互联网上的研究,但没有结果 – Walidou

+0

错误发生 - 我们理解.....向我们展示你的尝试,无论脚本作品不好 –

回答

1

您的示例中存在不一致。如果按“组”,则表示由$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 

我承认,比你的例子不同,但我认为你的例子就需要更多的解释。

+0

非常感谢你这真的很有帮助对我来说! 我承认我的例子并不是很明确,这是我第一次在这里使用stackoverflow,我不知道它究竟是如何工作的! 你的脚本的第一个输出是我试图找到的,我试过你的代码,没有为我工作,我得到的结果只有“month lat lng”而不是其他行 但代码对我很有帮助,因为我终于将代码转换成了第一个和第二个字段,并且我认为我可以通过它再次完成代码的其余部分 再次感谢@dawg – Walidou

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 `