¿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: 

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}'

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.


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

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


12

-Fes un argumento en awksí mismo:

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

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}'

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

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 ...


2

O puedes usar:

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

Esta es una ecuación realmente divertida.


1
que /1/significa

Encuentra un patrón. En este caso "1"
José Dias
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.