Estendendo o one-liner do awk para identificar pares de colunas correspondentes (linha por linha), para várias colunas

0

Estou usando o Win7 com o Cygwin. Eu tenho um one-liner que irá trabalhar para identificar correspondências em um par de colunas, mas quando eu 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 eu substituir "& &" para "||" Eu também recebo erros ("newline inesperado 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 de lote").

Então aqui está um arquivo de entrada de exemplo, 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

Eu quero poder ver se, em cada linha do arquivo, as colunas 1, 4 e 6 correspondem uma à outra. 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 idéia?

    
por Simonmdr 25.05.2015 / 06:36

2 respostas

0

Tente evitar || e &&

  • Para && test

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

  • Para || test

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

por 25.05.2015 / 08:14
0

Entendi finalmente. Estou usando o Cygwin com o Win7. As marcas de aspas simples não eram boas, então substituir TODAS as aspas simples por aspas duplas fixou a sintaxe e, adicionalmente, "||" não foi bom, mas "& &" funciona bem. Então, os seguintes trabalhos:

gawk -F "^" "{if ($ 1 == $ 2 & $ 3 == $ 4 & $ 4 == $ 5 & $ 5 == $ 6) impressão 0; caso contrário imprima $ 1, $ 2 , $ 3;} "infile.txt > outfile.txt

    
por 26.05.2015 / 10:04

Tags