2008-10-17 27 views

Respuesta

9

El punto clave aquí es que el carácter de tubería (|) debe escaparse al shell. Use "\|" o "'|'" para protegerlo de la interacción con el shell y permita que se pase al awk en la línea de comandos.


Leyendo los comentarios que veo que el cartel original presenta una versión simplificada del problema original que involucró filtrado file antes de seleccionar e imprimir los campos. Se utilizó un pase a través de grep y el resultado fue enviado a awk para la selección de campo. Eso explica el cat file totalmente innecesario que aparece en la pregunta (reemplaza al 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. Usar algo como:

awk -F\| '/<pattern>/{print $2;}{next;}' file 

El bit /<pattern>/ dice awk para realizar la acción que le sigue en las líneas que coincidan 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 desde hace mucho tiempo ...

3

El carácter de la tubería debe escaparse para que la consola no lo interprete. Una solución simple:

$ awk -F\| '{print $2}' file 

Otra opción sería la de citar el personaje:

$ awk -F'|' '{print $2}' file 
16

o simplemente utilizar un solo comando:

cut -d '|' -f FIELDNUMBER 
+0

Tenga en cuenta que la clave del problema es el carácter de la tubería, no el comando utilizado. Pero esta es una buena solución. –

+0

Lo pensé, pero prefiero tener una respuesta que explique el problema. Ese es el punto de mi comentario, de hecho. ;-) –

+0

Sería 'cut -d '|' -f FIELDNUMBER FILENAME' – Andrea

0

Y 'archivo' no contiene barras verticales, por lo no imprime nada. Debería usar 'cat file' o simplemente listar el archivo después del programa awk.

+0

Urg. Lo siento por eso. El código original grep'ed un archivo luego canalizó la salida a awk. Limpié el comando, pero no lo probé. :( –

Cuestiones relacionadas