En esta respuesta,

awk '$2=="no"{$3="N/A"}1' file

fue aceptada. Nota el 1 al final del script AWK. En los comentarios, el autor de la respuesta, dijo

[1] es un críptico manera de mostrar la línea actual.

Estoy perplejo. ¿Cómo funciona eso?

  • Usted puede echar un vistazo a esta página: backreference.org/2010/02/10/idiomatic-awk
  • y este: catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls
  • Hice voto de esta pregunta, ya que este ha sido preguntado una y otra vez. Sólo hacer una búsqueda en google o leer alguna información básica acerca de awk
  • [Para muchas personas] stackoverflow hace que sea mucho más fácil encontrar respuestas de largos artículos y foros de discusión, etc. Así que no importa cuán a menudo la pregunta es contestada en otro lugar, un stackoverflow post todavía agrega valor.
  • Yo voto a esta pregunta, ya que Google se mueve a la derecha aquí.

3 Comentarios

  1. 31

    En awk,

    Desde 1 siempre se evalúa a verdadero, se realiza la operación predeterminada {print $0}, por lo tanto se imprime la línea actual almacenado en $0

    Así, awk '$2=="no"{$3="N/A"}1' file es equivalente a y taquigrafía de

    awk '$2=="no"{$3="N/A"} {print $0}' file

    De nuevo $0 es argumento predeterminado a de impresión, por lo que podría también escribir

    awk '$2=="no"{$3="N/A"} {print}' file

    En el hecho de que también se podría utilizar cualquier número distinto de cero, o cualquier condición que siempre se evalúa a verdadero en lugar de 1

    • Podría proporcionar una referencia a la documentación?
  2. 8

    La documentación dice

    En un awk regla, sea el patrón o la acción puede ser omitido, pero no tanto. Si el patrón se omite, entonces la acción se realiza para cada línea de entrada. Si la acción se omite, la acción predeterminada es imprimir todas las líneas que coincidan con el patrón.

    Así, se trata 1 como patrón con ninguna acción. La acción predeterminada es imprimir la línea.

    Incluso si usted tiene un par de reglas, como en

    awk '
        in_net {
            if (/^\s+bindIp:/) {
                print "  bindIp: 0.0.0.0"
                next
            } else if (/^\s*(#.*)?$/) {
                in_net = 0
            }
        }
        /^net:/{
            in_net = 1
        }
        1
    ' /etc/mongod.conf

    Usted todavía necesita 1, ya que la acción por defecto se activa sólo cuando se enfrentan a la regla con ninguna acción.

  3. 2

    AWK obras en el método de la condición y, a continuación, la acción. Así que si alguna condición es TRUE cualquier acción que podemos mencionar a suceder será ejecutado a continuación.

    En caso de 1 significa que estamos haciendo que la condición sea VERDADERA y en este caso no estamos mencionando cualquier acción a pasar, así awk por acción predeterminada print va a suceder.

    Así que esta es la razón por la que escribimos 1 en acceso directo hablando realmente.

Dejar respuesta

Please enter your comment!
Please enter your name here