使用 awk 计算“滚动最大值”并打印第 2 列中的相应记录

使用 awk 计算“滚动最大值”并打印第 2 列中的相应记录

这是我的文件(实际上有几百万行):

1   75
2   188
3   279
4   267
5   100
6   28
7   479
8   325
9   225
10  181

我想找到前 5 行(第 1-5 行)第二列的最大值,并打印该最大值以及第一列的相应值。然后移动到接下来的五行(第 6-10 行)并执行相同的操作。

输出应该是:

3 279
7 479

到目前为止,我可以这样计算滚动最大值:

awk '{for(i=1;i<=NF;i++) if($i>maxval) maxval=$i;} NR%5==0 { print maxval; maxval= -1}' input.file

但是,我无法打印第一列中的相应值。我尝试定义第二个变量,例如want=$1然后尝试print maxval, want但没有成功。我有一个模糊的印象,这可以用数组来完成,但我所有的尝试都没有成功。

TP

答案1

我不认为循环结束领域就是你想要的。相反,只需查看记录号(或文件记录号以允许其处理多个文件)模 5:

$ awk '!((FNR-1)%5) || $2 > max {x = $0; max = $2} !(FNR%5) {print x}' file
3   279
7   479
  • 如果FNR是 1,6,... OR$2大于当前运行的最大值,则保存当前行/最大值

  • if FNRis 5,10,... 打印当前行/最大值

答案2

不是awk答案,但对于那些喜欢 shell 工具的人来说GNU split方法的工作原理:

split -l 5 --filter 'sort -n -k 2 | tail -1'  file

相关内容