Condicional se cláusula no awk

3

Por favor, considere o arquivo abaixo:

foo,1000,boo,A
foo,1000,boo,B
foo,1001,boo,B
foo,1002,boo,D

E temos as regras abaixo:

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

Eu quero aplicar as regras acima a um único comando awk , onde se $4 não obedecer, imprima o registro.

A saída desejada seria:

foo,1000,boo,B
foo,1002,boo,D

Eu tentei com:

awk -F, '{if(($2==1000 && $4!=A) || ($2==1001 && $4!=B) || ($4==1002 && $4!=C)){print $0}}'
    
por Eng7 26.08.2015 / 13:37

4 respostas

5

Use isto:

awk -F, '($2==1000 && $4!="A") || ($2==1001 && $4!="B") || ($2==1002 && $4!="C")' file

Nos brachets curvy são as 3 condições; se um deles se aplicar, a linha será impressa. As condições dentro dos parênteses estão conectadas com um AND, então ambas devem ser aplicadas.

    
por 26.08.2015 / 13:49
3

Os longos | muitos termos melhor colocados em ordem:

awk -F, 'BEGIN{a[1000]="A";a[1001]="B";a[1002]="C"}$4!=a[$2]' file
    
por 26.08.2015 / 14:08
2

Você pode fazer isso com egrep :

egrep -v '.*,((1000,.*,A)|(1001,.*,B)|(1002,.*,C))' filename

Combinará todas as linhas que não tiverem a 2ª coluna com 1000 e 4ª com A, 2ª com 1001 e 4ª com B ou 2ª com 1002 e 3ª com C.

    
por 26.08.2015 / 13:54
1

use grep

grep -v '.1000.*.A\|.1001.*.B\|.1002.*.C' input filename

e seu awk será corrigido como abaixo

 awk -F, '{if(($2==1000 && $4!="A") || ($2==1001 && $4!="B") || ($2==1002 && $4!="C"))print $0}' inputfilename
    
por 26.08.2015 / 13:57