Dado el siguiente comando:

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

¿por qué awk salida:

1: 
InformationsquelleAutor user173446 | 2010-04-09

8 Comentarios

  1. 335

    «-F» es un argumento de línea de comandos no awk sintaxis, la prueba:

     echo "1: " | awk -F  ":" '/1/{print $1}'
    • Ignorante la pregunta aquí: de /1/ parte es decir awk para que solo proceso de filas (registros o para ser más precisos) que contienen el número 1 a la derecha?
    • exactamente
  2. 55

    Si quieres hacerlo mediante programación, puede utilizar el FS variable:

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

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

  3. 23

    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 por un volverá 1 para una muestra de entrada «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 último ejemplo con el BEGIN declaración sería la más correcta (siendo consistente con la awk sintaxis).
    • todos ellos están bien. Yo tiendo a usar BEGIN si puedo usar un archivo para almacenar toda la cosa, mientras que -F práctico con contestaciones.
    • Se debe decir que hay diferencias sutiles entre el tercer caso y todos los demás. Ejemplo : awk 'BEGIN{print split("foo:bar",a)}' FS=":" file y awk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
  4. 12

    -F es un argumento para awk sí mismo:

    $echo "1: " | awk -F":" '/1/{print $1}'
    1
    • No hay necesidad de citar colon.
  5. 5

    AWK funciona como texto intérprete que va linewise para todo el documento y que va fieldwise para cada línea de mus $1,$2..$n son las referencias a los campos de cada línea($1 es el primer campo,$2 es el segundo campo y así sucesivamente…).
    Se puede definir un separador de campo mediante la opción «-F» interruptor debajo de la línea de comandos o dentro de los dos soportes con «FS=…».
    Ahora considere la respuesta de «JUERGEN» :

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

    Por encima de los campos límites son establecidos por «:» así que tenemos dos campo $1 que es «1» y $2, que ES el espacio vacío.Después, viene la expresión regular «/1/» que indica que el filtro de salida de la primera de campo sólo cuando el intérprete se tropiezan con una línea que contiene dicha expresión(me refiero a 1);
    La salida del comando «echo» es una línea que contiene «1» de modo que el filtro funcionará…

    Cuando se trata con el siguiente ejemplo :

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

    La sintaxis es desordenado y la intérprete optó por ignorar la parte F «:»
    y de conmutación para el valor predeterminado del campo splitter que es el vacío del espacio por lo tanto la salida «1:» como el primer campo y no habrá un segundo campo!

    La respuesta de JUERGEN contiene la buena sintaxis…

  6. 4

    También puede utilizar una expresión regular como separador de campo, el siguiente va a imprimir «de la barra» mediante el uso de una expresión regular para establecer el número «10» como separador.

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

    No hay Necesidad de escribir esto. Sólo hay que poner su deseado separador de campo con la opción-F en el comando awk y el número de columna que desea imprimir segregados según su mencionados separador de campo.

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

    O puede utilizar:

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

    Esto es realmente divertido ecuación.

    • ¿qué /1/ decir?

Dejar respuesta

Please enter your comment!
Please enter your name here