awkを使用して、前の行の$ 3の値が同じ場合、現在の行をどのように削除できますか?

awkを使用して、前の行の$ 3の値が同じ場合、現在の行をどのように削除できますか?

タイトルが示すように、現在の$ 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

関連情報