
次のフィールドを含む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番目の列と異なる場合は中断されます。v
vが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
方法は、以前に見たことがない場合は元の行を印刷することです。
答え2
注文する:awk '$3!=$4 && $4!=$5&& $5 !=$3 {print $0}' filename
出力
awk '$3!=$4 && $4!=$5&& $5 !=$3 {print $0}' filename
description ID valueA valueB valueC
yyy y 3 100 23