複数の列に基づいて重複した値を削除する方法

複数の列に基づいて重複した値を削除する方法

次のフィールドを含むtmp.logファイルがあります。

description ID  valueA valueB valueC
xxx         x    1       1     1
yyy         y    3       100    23
zzz         z    0       0      0
aaa         a    4       4      4

「値」列から同じ値を持つすべてのデータ要素を削除したいと思います。

description ID  valueA valueB valueC
yyy         y    3       100    23

使っています

cat tmp.log | tail -n+2 | awk '!a[$3$4$5]++'

ただし、まだ重複した値が印刷されます。これが間違った理由と解決策は何ですか?

ベストアンサー1

列3、4、5が同じ行を削除します。

awk '!($3==$4&&$4==$5)' data_file

他の行と同じ3,4,5列の行を削除します。

awk '!seen[$3,$4,$5]++' data_file

n個の列を更新

同じ列3、4、... nの行を削除します。

awk 'v=0;{for(i=4;i<=NF;i++) {if($i!=$3) {v=1; break;}}} v' data_file
  • v=0各レコードのvを0にリセット
  • for(i=4;i<=NF;i++) {if($i!=$3) {v=1; break;}}4番目の列から最後の列まで繰り返し、vを1に設定し、3番目の列と異なる場合は中断されます。
  • vvが0でない場合は印刷します。

他の行と同じ3,4,...n列の行を削除します。

awk '(l=$0) && ($1=$2=""); !seen[$0]++ {print l}' data_file
  • (l=$0) && ($1=$2="")元の行をバックアップし、最初の列と2番目の列を消去して再構築します$0。この式は常に false と評価されるため、何も印刷されません。に&&比べて優先順位が高い=ので()必要なのです。
  • !seen[$0]++ {print l}一般的なseen方法は、以前に見たことがない場合は元の行を印刷することです。

おすすめ記事