awk 中的条件 if 子句

awk 中的条件 if 子句

请考虑以下文件:

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

相关内容