这是我的文件(实际上有几百万行):
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
FNR
is 5,10,... 打印当前行/最大值
答案2
不是awk
答案,但对于那些喜欢 shell 工具的人来说GNU split
方法的工作原理:
split -l 5 --filter 'sort -n -k 2 | tail -1' file