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

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

두 번째 열 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

관련 정보