Extender awk one-liner desde identificar un par de columnas coincidentes (fila por fila) hasta varias columnas

Extender awk one-liner desde identificar un par de columnas coincidentes (fila por fila) hasta varias columnas

Estoy usando Win7 con Cygwin. Tengo un resumen que funcionará para identificar coincidencias en un PAR de columnas, pero cuando intento introducir columnas adicionales (es decir, >2) no puedo hacerlo funcionar. Entonces lo siguiente me funciona:

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

Sin embargo, cuando agrego otro par de columnas, obtengo errores de sintaxis:

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

Entonces, algo anda mal con el comando, pero los mensajes de error no me son realmente útiles. Cuando sustituyo "&&" por "||" También recibo errores ("nueva línea inesperada o final de cadena" inmediatamente después del primer "$7" y también "$3 no se reconoce como un comando interno o externo, programa ejecutable o archivo por lotes").

Aquí hay un archivo de entrada de ejemplo, que contiene las tres filas, con "^" como delimitador de columna:

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

paris^london^munich^paris^rome^paris

paris^london^munich^berlin^rome^paris

Quiero poder ver si, en cada fila del archivo, las columnas 1, 4 y 6 coinciden entre sí. Entonces, en este caso, la fila 1 es "sí", la fila 2 es "sí" y la fila 3 es "no". Por lo tanto, el resultado debería mostrar "0" para "sí" o repetir toda la fila para "no". Entonces la salida sería:

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

Algunas ideas ?

Respuesta1

Trate de evitar ||y&&

  • para &&prueba

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

  • para ||prueba

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

Respuesta2

Finalmente lo tengo. Estoy usando Cygwin con Win7. Las comillas simples no eran buenas, por lo que reemplazar TODAS las comillas simples con comillas dobles arregló la sintaxis y, además, "||" No fue bueno, pero "&&" funciona bien. Entonces lo siguiente funciona:

boquiabierto -F "^" "{ if ($1 == $2 && $3 == $4 && $4 == $5 && $5 == $6) imprime 0; de lo contrario imprime $1,$2,$3; }" infile.txt > outfile.txt

información relacionada