如何查找大文件中每 5 行的最大值。我有像这样的文件:
186 5 24.0772 24.061 18.5996 2.14E+06
123 4 25.838 29.4805 25.8075 1.25E+06
47 4 24.0637 27.5751 18.7376 915260
44 4 22.2291 25.915 18.7651 2.13E+06
22 4 20.5204 31.1934 25.8222 958569
2 4 18.6967 24.0007 24.0214 2.35E+06
11 4 18.66 25.8085 22.2719 1.99E+06
3 4 20.4814 22.3203 24.1144 2.02E+06
4 4 20.5083 24.0258 22.2133 1.90E+06
23 4 22.2675 20.584 24.0367 2.05E+06
24 4 24.1038 18.7206 24.0185 2.33E+06
25 4 24.0527 20.4908 22.3148 3.19E+06
30 4 22.2784 24.118 20.574 3.06E+06
31 4 22.2229 22.3165 22.3832 1.35E+06
32 4 22.3877 23.9854 24.0684 2.45E+06
33 4 24.0543 22.2423 24.0071 3.66E+06
34 4 23.9802 24.1058 22.2199 2.71E+06
185 5 24.0362 22.2425 20.4836 2.73E+06
77 4 25.8136 20.4698 24.0521 2.94E+06
189 5 25.8148 24.0693 24.0799 1.50E+06
所以我想返回该文件第 6 列中每 5 行的最大值,因此结果必须如下所示:
2.14E+06
2.35E+06
....
....
awk
任何方法都可以通过Linux 中的其他方法来完成。
答案1
$ awk '(NR-1) % 5 == 0 { m=$1; for (i=2; i<=NF; ++i) m=($i>m ? $i : m); print m }' file
2.14E+06
2.35E+06
2.33E+06
3.66E+06
或者,使用明确的if
声明:
$ awk '(NR-1) % 5 == 0 { m=$1; for (i=2; i<=NF; ++i) if ($i > m) m = $i; print m }' file
2.14E+06
2.35E+06
2.33E+06
3.66E+06
该awk
程序用于(NR-1) % 5 == 0
触发第 1、11、16 行等的代码块。该块找到一行中的最大值并将其打印出来。
NR
是当前记录号(默认为行号),NF
是当前记录中的字段(列)数。
如果你总是想得到最后的列,使用更快
$ awk '(NR-1) % 5 == 0 { print $NF }' file
2.14E+06
2.35E+06
2.33E+06
3.66E+06
答案2
$ awk '{max = ((max=="") || ($6 > max) ? $6 : max)} !(NR%5){print max; max=""}' file
2.14E+06
2.35E+06
3.19E+06
3.66E+06
答案3
$ perl -lane '
$F[5] > ($m //= -InF) and $m = $F[5];
$. % 5 or print, undef for $m;
' file
2.14E+06
2.35E+06
3.19E+06
3.66E+06