awkの条件に一致する2つのパターンの間に行を印刷します。

awkの条件に一致する2つのパターンの間に行を印刷します。

特定の条件を満たす2つのパターンの間に線を印刷する方法は?

たとえば、入力ファイルの場合部分的に次のコンテンツが含まれています。

Time         %MEM    %CPU    %SWAP
00:05:02      7.3     8.4     3.5
00:10:02      10      4.3     4.5
00:15:02      8.5     4.4     6.7
00:20:02      25.3    35.8    7.3
00:25:02      74.6    28.4    7.3
00:30:02      67.2    88.3    7.3
00:35:02      35.4    87.4    7.3
00:40:02      27.3    92.8    7.3
00:45:02      45.3    83.2    10.5
00:50:02      30      65.7    10.5
01:00:02      92.3    66.4    10.5
01:05:02      13.1    69.4    13.5
01:10:02      45.2    77.4    13.5
01:15:02      48.7    78.8    13.5
01:20:02      49.1    80.5    13.5
01:25:02      72      83.9    13.5
END

初めてスワップ値を印刷し、7より大きいすべてのスワップ値を印刷したいと思います。だから私の出力は次のようになります

00:20:02   7.3
00:45:02   10.5
01:05:02   13.5

私は試した:

awk '/%SWAP/{flag=1;next}/End/{flag=0}flag' myFile

すべての行を印刷します。私も次のことを試しました。

awk '/%SWAP/ {flag=1;next}
     /End/{flag=0}
     {if ($10 > max) {max=$10; print $1 " " $2 " " $4}}' myFile

しかし、これは私にファイルの前の部分の出力を与えます$4

誰にも解決策はありますか?どんな説明でもよろしくお願いします。

答え1

あなたは言うことができます:

$ awk '($4>7 && $4!=swap) {swap=$4; print $1, $4}' file
00:20:02 7.3
00:45:02 10.5
01:05:02 13.5

つまり、SWAPより大きい最後の値を変数7に保存し、その値を比較し続けます。swap

-v OFS="\t"出力フィールド区切り文字をtab:またはに設定すると、より良い出力が得られますBEGIN {OFS="\t"}。またはにパイプすることができますcolumn -t

関連情報