次の記事を検討してください。
foo,1000,boo,A
foo,1000,boo,B
foo,1001,boo,B
foo,1002,boo,D
私たちは次の規則を持っています:
If $2 equal 1000, $4 should be equal A
If $2 equal 1001, $4 should be equal B
If $2 equal 1002, $4 should be equal C
awk
上記のルールを単一のコマンドに適用し、$4
従わない場合は、履歴を印刷したいと思います。
希望の出力は次のとおりです。
foo,1000,boo,B
foo,1002,boo,D
私は以前試しました:
awk -F, '{if(($2==1000 && $4!=A) || ($2==1001 && $4!=B) || ($4==1002 && $4!=C)){print $0}}'
答え1
これを使用してください:
awk -F, '($2==1000 && $4!="A") || ($2==1001 && $4!="B") || ($2==1002 && $4!="C")' file
カーブ括弧には3つの条件があり、そのうちの1つが適用されると線が印刷されます。括弧内の条件はANDで連結されているため、両方を適用する必要があります。
答え2
long |多くの用語を配列に配置するのが最善です。
awk -F, 'BEGIN{a[1000]="A";a[1001]="B";a[1002]="C"}$4!=a[$2]' file
答え3
あなたはこれを行うことができますegrep
:
egrep -v '.*,((1000,.*,A)|(1001,.*,B)|(1002,.*,C))' filename
2番目の列1000、4番目の列A、2番目の列1001、4番目の列B、または2番目の列1002、3番目の列Cがないすべての行と一致します。
答え4
grepを使う
grep -v '.1000.*.A\|.1001.*.B\|.1002.*.C' input filename
あなたのawkは次のように修正されます
awk -F, '{if(($2==1000 && $4!="A") || ($2==1001 && $4!="B") || ($2==1002 && $4!="C"))print $0}' inputfilename