awk:パターンに一致する段落の最後のn個の出現を印刷します。

awk:パターンに一致する段落の最後のn個の出現を印刷します。

このコマンドを使用して、awk -v RS= '/index/' longfile > dataIwant次の構造に基づいてデータ段落をファイルに保存します。dataIwantlongfile

 index   value       count 
      1     -32.4613      1.00000
      2     -20.5946      1.00000
      3     -13.3573      1.00000
      4     -13.2064      1.00000
      5     -13.2064      0.00000


 other stuff


 index   value       count 
      1     -31.4613      1.00000
      2     -19.5946      1.00000
      3     -12.3573      1.00000
      4     -12.2064      1.00000
      5     -12.2064      0.00000
 

 still a lot of other stuff


 index   value       count 
      1     -33.4613      1.00000
      2     -21.5946      1.00000
      3     -15.3573      1.00000
      4     -15.2064      0.00000
      5     -15.2064      0.00000


 again a lot of other stuff (and so on many times)

テーブル「インデックス、値、カウント」の最後のn(例:2)エントリのみをファイルに保存するのではなく、ファイルに保存する方法は?

予想出力:

 index   value       count 
      1     -31.4613      1.00000
      2     -19.5946      1.00000
      3     -12.3573      1.00000
      4     -12.2064      1.00000
      5     -12.2064      0.00000
 index   value       count 
      1     -33.4613      1.00000
      2     -21.5946      1.00000
      3     -15.3573      1.00000
      4     -15.2064      0.00000
      5     -15.2064      0.00000

答え1

最後のnレコードのスクロールバッファを保持してENDに印刷します。

$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
/index/ { recs[(++c)%n] = $0 }
END {
    for ( i=1; i<=n; i++ ) {
        print recs[(++c)%n]
    }
}

$ awk -v n=2 -f tst.awk file
 index   value       count
      1     -31.4613      1.00000
      2     -19.5946      1.00000
      3     -12.3573      1.00000
      4     -12.2064      1.00000
      5     -12.2064      0.00000


 index   value       count
      1     -33.4613      1.00000
      2     -21.5946      1.00000
      3     -15.3573      1.00000
      4     -15.2064      0.00000
      5     -15.2064      0.00000

答え2

一致する段落を配列に保存し、次のようにブロックのEND最後の要素を印刷します。nn=3

awk  -v n=3 -v RS= '/index/{z[i++]=$0};END{for (j=i-n; j<=i; j++) print z[j]}' in > out

関連情報