私のファイルは次のとおりです(実際には数百万行)。
1 75
2 188
3 279
4 267
5 100
6 28
7 479
8 325
9 225
10 181
最初の5行(1〜5行)のうち2番目の列の最大値を見つけて、最初の列の対応する値とともにその最大値を印刷したいと思います。次に、次の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
ただし、最初の列にその値を印刷することはできません。たとえば、2番目の変数を定義しようとしましたが、成功しませんでし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
答えではありませんが、シェルツールが好きな人のために牛に似た一種の栄養 split
方法の仕組み:
split -l 5 --filter 'sort -n -k 2 | tail -1' file