다음 문서를 고려해보세요:
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