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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top