Selecionando dois conjuntos de condições no awk

3

Eu tenho uma mesa

1 1
1 0
0 1
0 0

Eu quero imprimir as linhas com dois conjuntos de critérios de seleção separados por OR .

Conjunto de critérios 1: (Coluna 1 > = 1 e Coluna 2 = 0)

OR

Conjunto de critérios 2: (Coluna 1 = 0 e Coluna 2 > = 1)

A saída esperada é

1 0
0 1

Eu escrevi algo assim, mas não funcionou

awk '($1>=1 && $2=0)||($1=0 && $2>=1) {print $0}'

Qual é o problema?

    
por Johnny Tam 08.10.2017 / 09:58

4 respostas

6

O problema é que você está usando um operador de atribuição ( = ) em vez de uma comparação de igualdade ( == ). O resultado booleano de atribuir zero a algo é "falso". É por isso que o teste nunca foi bem sucedido.

O comando idônimo awk seria

awk '($1 >= 1 && $2 == 0) || ($1 == 0 && $ 2 >= 1)'

O { print $0 } não é necessário, pois essa é a ação padrão para qualquer condição que não tenha uma ação.

Se você quiser apenas pular linhas com os mesmos valores na coluna um e dois (fornece a mesma saída para os dados fornecidos):

awk '$1 != $2'

A saída em ambos os casos é

1 0
0 1
    
por 08.10.2017 / 10:04
2

Além do problema que você teve em seu comando awk usando = em vez de == para comparação que < strong> Kusalananda apontou que . O que eu entendi da sua entrada e do comando que você está usando, você quer aquela linha quando pelo menos um deles é zero).

Supondo que você não tenha valores negativos, use:

awk '($1 && !$2) || (!$1 && $2)' infile

Ou ainda mais curto (você também pode usar - ).

awk '($1 * !$2) + (!$1 * $2)' infile
    
por 08.10.2017 / 12:34
1

Alternativa egrep solution:

egrep '^([1-9][0-9]* *0|0 *[1-9][0-9]*)$' file

A saída:

1 0
0 1
    
por 08.10.2017 / 12:03
0

Você não precisa usar OR entre os dois, você pode até mesmo adicionar mais critérios, basta adicionar cada um deles em uma linha separada e salvá-lo em um arquivo de texto, por exemplo, 'criteria.awk' e execute-o assim: awk -f criteria.awk table.dat

aqui está o conteúdo do awkscriptfile:

{
    if ($1 >= 1 && $2 == 0) print $0;
    if($1 == 0 && $2 >=1) print $0;
}
    
por 11.10.2017 / 12:06

Tags