bash - print - ¿Cómo imprimo un campo de un archivo separado por tubería?
awk variables shell (4)
Tengo un archivo con campos separados por caracteres de tubería 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?
El carácter de tubería debe escaparse para que el intérprete de comandos no lo interprete. Una solución simple:
$ awk -F/| ''{print $2}'' file
Otra opción sería citar al personaje:
$ awk -F''|'' ''{print $2}'' file
El punto clave aquí es que el carácter de la tubería ( |
) debe escaparse al caparazón. Use " /|
" o " ''|''
"para protegerlo de la interferencia del intérprete de comandos y permitir que pase a awk
en la línea de comando.
Al leer los comentarios, veo que el póster original presenta una versión simplificada del problema original que implicaba filtrar el file
antes de seleccionar e imprimir los campos. Se utilizó un paso a través de grep
y el resultado se canalizó a awk para la selección de campo. Eso explica el cat file
totalmente innecesario 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í misma, y se puede confiar en que encuentre y trabaje en las líneas coincidentes sin necesidad de invocar grep
. Use algo como:
awk -F/| ''/<pattern>/{print $2;}{next;}'' file
El /<pattern>/
bit le dice a awk
que realice la acción que sigue en las líneas que coinciden con <pattern>
.
El aspecto perdido {next;}
es una acción predeterminada que salta a la siguiente línea en la entrada. No parece ser necesario, pero tengo este hábito de hace mucho tiempo ...
O solo usa un comando:
cut -d ''|'' -f FIELDNUMBER
Y ''archivo'' no contiene símbolos de tubería, por lo que no imprime nada. Debería usar ''cat file'' o simplemente listar el archivo después del programa awk.