ultimo separador print linea leer imprimir filtrar fichero campos campo bash awk gawk

bash - separador - linux awk print



Cómo usar ":" como separador de campo awk? (8)

Dado el siguiente comando:

echo "1: " | awk ''/1/ -F ":" {print $1}''

¿Por qué awk sale?

1:


"-F" es un argumento de línea de comando, no una sintaxis awk, intente:

echo "1: " | awk -F ":" ''/1/ {print $1}''


AWK funciona como un intérprete de texto que va en línea para todo el documento y va para cada línea por $ 1, $ 2 ... $ n son referencias a los campos de cada línea ($ 1 es el primer campo, $ 2 es el segundo campo y así sucesivamente ...). Puede definir un separador de campo usando el interruptor "-F" debajo de la línea de comando o dentro de dos corchetes con "FS = ...". Ahora considera la respuesta de "JUERGEN":

echo "1: " | awk -F ":" ''/1/ {print $1}''

Por encima de los límites del campo se establecen por ":" entonces tenemos dos archivos $ 1 que es "1" y $ 2 que ES el espacio vacío. Después, viene la expresión regular "/ 1 /" que indica al filtro que solo muestre el primer campo cuando el intérprete tropieza con una línea que contiene tal expresión (quiero decir 1); La salida del comando "eco" es una línea que contiene "1" para que el filtro funcione ...

Cuando se trata del siguiente ejemplo:

echo "1: " | awk ''/1/ -F ":" {print $1}''

La sintaxis es desordenada y el intérprete optó por ignorar la parte F ":" y cambió al divisor de campo predeterminado, que es la fuente vacía, dando como resultado "1:" como primer campo y ¡no habrá un segundo campo!

La respuesta de JUERGEN contiene la buena sintaxis ...


No es necesario escribir tanto. Simplemente coloque el separador de campo deseado con la opción -F en el comando awk y el número de columna que desea imprimir segregado según el separador de campo mencionado.

echo "1: " | awk -F: ''{print $1}'' 1 echo "1#2" | awk -F# ''{print $1}'' 1


O puede usar:

echo "1: " | awk ''/1/{print $1-":"}''

Esta es una ecuación realmente divertida.


Si quieres hacerlo programáticamente, puedes usar la variable FS :

echo "1: " | awk ''BEGIN { FS=":" } /1/ { print $1 }''

Tenga en cuenta que si lo cambia en el ciclo principal en lugar del ciclo BEGIN , entra en vigencia para la siguiente línea leída, ya que la línea actual ya se ha dividido.


También puede usar una expresión regular como separador de campo, lo siguiente imprimirá "barra" usando una expresión regular para establecer el número "10" como separador.

echo "foo 10 bar" | awk -F''[0-9][0-9]'' ''{print $2}''


Usted tiene múltiples formas de configurar : como separador:

awk -F: ''{print $1}'' awk -v FS=: ''{print $1}'' awk ''{print $1}'' FS=: awk ''BEGIN{FS=":"} {print $1}''

Todos ellos son equivalentes y para un volverán 1 para una entrada de muestra "1: 2: 3":

$ awk -F: ''{print $1}'' <<< "1:2:3" 1 $ awk -v FS=: ''{print $1}'' <<< "1:2:3" 1 $ awk ''{print $1}'' FS=: <<< "1:2:3" 1 $ awk ''BEGIN{FS=":"} {print $1}'' <<< "1:2:3" 1


-F es un argumento para awk sí mismo:

$echo "1: " | awk -F":" ''/1/ {print $1}'' 1