¿Cómo utilizar ":" como separador de campo awk?

243

Dado el siguiente comando:

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

¿Por qué la salida awk:

1: 
usuario173446
fuente

Respuestas:

382

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

 echo "1: " | awk -F  ":" '/1/ {print $1}'
Jürgen Hötzel
fuente
42
La pregunta de Ignorante aquí: la parte / 1 / es decirle a awk que solo procese filas (o registros para ser más precisos) que contienen el número 1, ¿verdad?
rantsh
3
Parece la sintaxis de @rantsh Awk (pattern){action}. Si pattern(principalmente una declaración condicional) es verdadero , actionse ejecuta. Si patternno está disponible, trueestá implícito. Aquí patternestá /1/qué estados son expresiones regulares 1coincidentes en el registro actual$0
kvantour
62

Si quieres hacerlo programáticamente, puedes usar la FSvariable:

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

Tenga en cuenta que si lo cambia en el bucle principal en lugar del BEGINbucle, tiene efecto para la siguiente línea leída, ya que la línea actual ya se ha dividido.

Pausado hasta nuevo aviso.
fuente
35

Tiene varias formas de establecer :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 regresará 1para 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
fedorqui 'así que deja de dañar'
fuente
cual es la forma preferida Supongo que el ejemplo final con la BEGINdeclaración sería el más correcto (siendo coherente con la awksintaxis general ).
1
@randomware todos ellos están bien. Tiendo a usar BEGINsi uso un archivo para almacenar todo, mientras que -Fes útil con frases ingeniosas.
Fedorqui 'así que deja de dañar'
1
Hay que decir que hay diferencias sutiles entre el tercer caso y todos los demás. Ejemplo: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileyawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour
@kvantour buen punto. Solo pregunté al respecto en ¿Por qué el separador de campo se tiene en cuenta de manera diferente si se establece antes o después de la expresión? .
fedorqui 'SO deja de dañar'
12

-Fes un argumento en awksí mismo:

$echo "1: " | awk -F":" '/1/ {print $1}'
1
danben
fuente
2
No es necesario citar dos puntos.
ceving
6

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}'
Zlemini
fuente
4

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 su separador de campo mencionado.

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

echo "1#2" | awk -F# '{print $1}'  
1
Bhavuk Taneja
fuente
4

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

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

Por encima de los límites del campo se establecen con ":", por lo que tenemos dos campos $ 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 dicha expresión (quiero decir 1); La salida del comando "echo" es una línea que contiene "1" para que el filtro funcione ...

Cuando se trata con el siguiente ejemplo:

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

La sintaxis es desordenada y el intérprete decidió ignorar la parte F ":" y cambia al divisor de campo predeterminado, que es el espacio vacío, lo que genera "1:" como primer campo y no habrá un segundo campo.

La respuesta de JUERGEN contiene la buena sintaxis ...

jihed gasmi
fuente
2

O puedes usar:

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

Esta es una ecuación realmente divertida.

Vonton
fuente
1
que /1/significa
Encuentra un patrón. En este caso "1"
José Dias