2010-04-09 113 views

Respuesta

239

"-F" es un argumento de línea de comandos no sintaxis de awk, probar:

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

La pregunta de Ignorant aquí: la/1/parte es decirle a awk que solo procese las filas (o los registros para ser más precisos) que contienen el número 1, ¿verdad? – rantsh

+0

@rantsh exactamente – rightfold

12

-F es una argumento a awk sí mismo:

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

No hay necesidad de citar dos puntos. – ceving

46

Si desea hacerlo mediante programación, puede utilizar la variable FS:

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

Tenga en cuenta que si lo cambia en el bucle principal en lugar del bucle BEGIN, que surte efecto para el siguiente línea de lectura, ya que la línea actual ya se ha dividido.

1

No es necesario escribir mucho. 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 
3

AWK trabaja como intérprete de texto que va linewise para todo el documento y que va fieldwise para cada línea tanto, $ 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 utilizando el interruptor "-F" debajo de la línea de comando o dentro de dos corchetes con "FS = ...". Consideremos ahora la respuesta de "Juergen":

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

Por encima de los limites de campo son fijados por ":" por lo que tenemos dos campos campos $ 1 que es "1" y $ 2, que es la space.After vacío, viene la expresión regular "/ 1 /" que ordena al filtro que muestre el primer campo solo cuando el intérprete tropieza con una línea que contiene dicha expresión (me refiero a 1); La salida del comando "eco" es una línea que containes "1" para que el filtro funcionará ...

Cuando se trata con el siguiente ejemplo:

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

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

La respuesta de JUERGEN contiene la buena sintaxis ...

7

tiene varias 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 por un regresará 1 para una entrada de la 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 
4

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

O puede utilizar:

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

Esta ecuación es realmente divertido.

Cuestiones relacionadas