Estendendo awk one-liner da identificação de pares correspondentes de colunas (linha por linha) para múltiplas colunas

Estendendo awk one-liner da identificação de pares correspondentes de colunas (linha por linha) para múltiplas colunas

Estou usando Win7 com Cygwin. Eu tenho uma linha que funcionará para identificar correspondências em um PAR de colunas, mas quando tento introduzir colunas adicionais (ou seja,> 2) não consigo fazê-lo funcionar. Então o seguinte funciona para mim:

gawk -F "^" '{ if ($3 == $7) print "0"; else print $3,$7; }' infile.txt > outfile.txt

No entanto, quando adiciono outro par de colunas, recebo erros de sintaxe:

gawk -F "^" '{ if ($3 == $7 || $3 == $11) print "0"; else print $3,$7,$11; }' infile.txt > outfile.txt

Então, algo está errado com o comando, mas as mensagens de erro não são realmente úteis para mim. Quando substituo "&&" por "||" Também recebo erros ("nova linha inesperada ou fim de string" logo após o primeiro "$7" e também "$3 não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote").

Então aqui está um exemplo de arquivo de entrada, contendo as três linhas, com "^" como delimitador de coluna:

paris^london^new york^paris^rome^paris

paris^london^munich^paris^rome^paris

paris^london^munich^berlin^rome^paris

Quero poder ver se, em cada linha do arquivo, as colunas 1, 4 e 6 correspondem entre si. Portanto, neste caso, a linha 1 é “sim”, a linha 2 é “sim” e a linha 3 é “não”. Portanto, a saída deve mostrar “0” para “sim” ou repetir a linha inteira para “não”. Então a saída seria:

0
0
paris^london^munich^berlin^rome^paris

Alguma ideia ?

Responder1

Tente evitar ||e&&

  • Para &&teste

    gawk -F "^" '$3 == $7{if($3 == $11){print "0"; next;}}{print $3,$7,$11}'

  • Para ||teste

    gawk -F "^" '$3 == $7{print "0"; next;}$3 == $11{print "0"; next;}{print $3,$7,$11}'

Responder2

Finalmente entendi. Estou usando Cygwin com Win7. As aspas simples não eram boas, portanto, substituir TODAS as aspas simples por aspas duplas corrigiu a sintaxe e, além disso, "||" não foi bom, mas "&&" funciona bem. Então funciona o seguinte:

gawk -F "^" "{ if ($1 == $2 && $3 == $4 && $4 == $5 && $5 == $6) imprimir 0; senão imprimir $1,$2,$3; }" infile.txt > outfile.txt

informação relacionada