タイトルが示すように、現在の$ 3を前の行の$ 3と比較し、同じ場合は現在の行を削除するにはどうすればよいですか?
たとえば、このファイル
100.824 4 Packet to
101.027 1 Received
102.23 1 Received
229.393 4 Packet to
229.605 1 Received
~になる
100.824 4 Packet to
101.027 1 Received
229.393 4 Packet to
229.605 1 Received
答え1
「現在行を削除」するには印刷しないでください。
したがって、あなたがすべきことは、3番目のフィールドである場合にのみ現在の行を印刷することです。は違う前の行の 3 番目のフィールドです。
これを行うには、次の行の3番目のフィールドと比較できるように、3番目のフィールドを変数に格納する必要があります。
awk 'NR == 1 || $3 != prev; { prev = $3 }' file
これにより、最初の行と3番目のフィールドがの値以外のすべての行が無条件に印刷されますprev
。これは次のとおりです。
awk 'NR == 1 || $3 != prev { print $0 } { prev = $3 }' file
しかし、私たちが使用することは、条件付きテストが評価されたときの基本的な動作が次のように評価されるという事実です。本物、現在行を印刷することです。
出力が発生または発生しない場合は、次の行の処理に使用prev
するために現在の行の3番目のフィールドに設定されます。
例:
$ cat file
1 2 3
1 2 3
a b c
d e f
1 2 3
1 2 3
$ awk 'NR == 1 || $3 != prev; { prev = $3 }' file
1 2 3
a b c
d e f
1 2 3
サンプルファイルが与えられると、このawk
スクリプトは以下を生成します。
100.824 4 Packet to
101.027 1 Received
229.393 4 Packet to
229.605 1 Received
最初の行の3番目のフィールドが次のようになっていることを確認できる場合常に空ではない、awk
次のようにコマンドを単純化できます。
awk '$3 != prev; { prev = $3 }' file