¿Cómo imprimo un campo desde un archivo separado por tuberías?
Pregunta
Tengo un archivo con campos separados por barras verticales y quiero imprimir solo el segundo campo.Este intento falla:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
¿Hay alguna forma de hacer esto?
Solución
El punto clave aquí es que el carácter de barra vertical (|
) debe escaparse al shell.Usar "\|
" o "'|'
" para protegerlo de la interpretación del shell y permitir que pase a awk
en la línea de comando.
Al leer los comentarios veo que el cartel original presenta una versión simplificada del problema original que involucraba el filtrado. file
antes de seleccionar e imprimir los campos.un paso a través grep
se utilizó y el resultado se canalizó a awk para la selección de campo.Eso explica lo totalmente innecesario cat file
que aparece en la pregunta (reemplaza el grep <pattern> file
).
Bien, eso funcionará.Sin embargo, awk es en gran medida una herramienta de coincidencia de patrones por sí sola, y se puede confiar en que encontrará y trabajará en las líneas coincidentes sin necesidad de invocarlas. grep
.Utilice algo como:
awk -F\| '/<pattern>/{print $2;}{next;}' file
El /<pattern>/
poco dice awk
para realizar la acción que sigue en líneas que coinciden <pattern>
.
la mirada perdida {next;}
es una acción predeterminada que salta a la siguiente línea en la entrada.No parece necesario, pero tengo esta costumbre desde hace mucho tiempo...
Otros consejos
O simplemente use un comando:
cut -d '|' -f FIELDNUMBER
El carácter de la tubería debe escaparse para que el shell no lo interprete. Una solución simple:
$ awk -F\| '{print $2}' file
Otra opción sería citar el personaje:
$ awk -F'|' '{print $2}' file
Y 'archivo' no contiene símbolos de tubería, por lo que no imprime nada. Debería usar 'archivo cat' o simplemente enumerar el archivo después del programa awk.