请考虑以下文件:
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 个条件;如果其中之一适用,则将打印该行。括号内的条件通过 AND 连接,因此两者都必须适用。
答案2
长|许多术语最好放入数组中:
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
将匹配所有没有第二列 1000、第四列 A、第二列 1001、第四列 B 或第二列 1002、第三列 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