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行)のうち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=$1print maxval, want。私はこれが配列から成ることができるという漠然とした印象を受けましたが、すべての試みは成功しませんでした。

TP

ベストアンサー1

私の考えでは、ループは終わらないと思います。フィールドあなたが望むもの。代わりに、モジュロ5でレコード番号(または複数のファイルを処理できるファイルレコード番号)を見てください。

$ awk '!((FNR-1)%5) || $2 > max {x = $0; max = $2} !(FNR%5) {print x}' file
3   279
7   479
  • FNR1,6,... OR が現在実行中の最大値より大きい場合、$2現在の行/最大値を保存します。

  • if FNRis 5,10,... 現在の行/最大値を印刷

おすすめ記事