Este comando

echo "hello world" | awk '{split($0, array, " ")} END{print length(array) }'

no funciona para mí y me da este mensaje de error

awk: línea 1: ilegal referencia a la matriz de la matriz de

¿Por qué?

  • En realidad, el código me funciona y devuelve 2 como se esperaba.
  • Funciona con gawk pero no POSIX awk o gawk --posix.
InformationsquelleAutor softghost | 2012-02-19

8 Comentarios

  1. 82

    Cuando se divide una matriz, el número de elementos devueltos, por lo que usted puede decir:

    echo "hello world" | awk '{n=split($0, array, " ")} END{print n }'
    # ------------------------^^^--------------------------------^^

    La salida es:

    2
    • He utilizado split (), pero nunca se dio cuenta de que devuelve un valor!
    • sorpresa! .. Sí, y lo que es un valor práctico. También, creo que usted encontrará que la mayoría de las funciones en awk devolver algún valor, probablemente inspirado en c idioma 0 por error o algún valor que no sea cero se devuelve como información útil. Buena suerte!
  2. 36

    Señor de Ventimiglia la función requiere un poco de ajuste para hacer el trabajo (véase el punto y coma en la declaración):

    function alen(a, i) {
        for(i in a);
        return i
    }

    Pero no funcionan todos los casos o momentos. Esto es debido a la manera que awk tienda y «ver» los índices de las matrices: son asociativas y no necesariamente contiguos (como C.) por Lo tanto, i no devuelve el último elemento.

    Para resolver esto, usted necesita contar:

    function alen(a, i, k) {
        k = 0
        for(i in a) k++
        return k
    }

    Y, de esta manera, tenga cuidado de otros tipos de índices de «unidimensional» de las matrices, donde el índice tal vez una cadena. Por favor, consulte: http://docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm. Para «multidimensional» y arbitraria de matrices, consulte http://www.gnu.org/software/gawk/manual/html_node/Walking-Arrays.html#Walking-Arrays.

  3. 21

    No creo que la persona que está preguntando, «¿Cómo puedo dividir una cadena y obtener la longitud de la matriz resultante?» Creo que el comando que proporcionan es sólo un ejemplo de la situación en la que surgió. En particular, creo que la persona que está pidiendo 1) ¿por Qué longitud(matriz) provocar un error, y 2) ¿Cómo puedo obtener la longitud de una matriz en awk?

    La respuesta a la primera pregunta es que la longitud de la función no funciona en las matrices en el estándar POSIX awk, aunque no en GNU awk (fíjate) y algunas otras variaciones. La respuesta a la segunda pregunta es (si queremos una solución que funciona en todas las variaciones de awk) para hacer una exploración lineal.

    Por ejemplo, una función como esta:

    function alen (a,     i) {
        for (i in a);
        return i;}

    NOTA: El segundo parámetro yo garantiza cierta explicación.

    La forma de introducir las variables locales en awk es como parámetros de la función y de la convención es para indicar que esta por la adición de espacios adicionales antes de estos parámetros. Esto se discute en la GNU Awk manual aquí.

    • buenos puntos. Mi objetivo era responder a la pregunta original con los términos de la O. P., es decir,. awk '{split($0, array, " ")}...', y de ahí mi respuesta, tomado de la utilización de split en el original de ‘El Lenguaje de Programación Awk’. Buena suerte a todos.
    • Gracias. Yo no tenía la intención de que mi respuesta sea de modo sucinto. Yo estaba en un poco de prisa. Tal vez voy a ablandar un poco.
    • Pero todo esto hace es devolver el primer índice de un array? También, el orden de la matriz de iteración no es especificado por POSIX.
    • la respuesta a La segunda pregunta es (si queremos una solución que funciona en todas las variaciones de awk) [es] para hacer una exploración lineal Y para contar y para devolver el número de elementos de la matriz dada: ... { for(i in a) c++; return c }
    • Este error había sido introducido por un desafortunado y desinformados edición de esta pregunta. Ahora, 6 años después, he vuelto al responder a la revisión correcta.
    • Oh, bueno, no realmente. Revisión 4 o 6 de esta respuesta en realidad no devolver la longitud de la matriz, sino sólo su aleatorios último índice.

  4. 16

    Sólo quiero señalar que:

    • No es necesario almacenar el resultado de la split función para imprimir.
    • Si el separador no es suministrado por la división, el valor predeterminado FS (espacio en blanco) será utilizado.
    • La END parte es inútil aquí.

      echo 'hello world' | awk '{print split($0, a)}'
  5. 11

    En gawk puede utilizar la función length():

    $ gawk 'BEGIN{a[1]=1; a[2]=2; a[23]=45; print length(a)}'
    3
    
    $ gawk 'BEGIN{a[1]=1; a[2]=2; print length(a); a[23]=45; print length(a)}'
    2
    3

    De El GNU Awk guía del usuario:

    Con gawk y varios otros awk implementaciones, cuando se da un argumento de matriz, la length() función devuelve el número de elementos en la
    matriz de
    . (c.e.) Esto es menos útil de lo que podría parecer en un principio, como
    la matriz no está garantizado para ser indexados desde uno hasta el número de
    elementos en ella. Si –pelusa está siempre en la línea de comandos (consulte la
    Las opciones), gawk advierte que el paso de un argumento de matriz no es portable.
    Si –posix se suministra, mediante un argumento de matriz es un error grave (ver
    Matrices).

  6. 2

    muestra en MacOSX Lion para mostrar los puertos de salida (puede ser 192.168.111.130.49704 o ::1.49704) :

       netstat -a -n -p tcp | awk '/\.[0-9]+ /{n=split($4,a,"."); print a[n]}'

    En esta muestra, que imprimir el último elemento de matriz de la 4ª columna : «49704»

Dejar respuesta

Please enter your comment!
Please enter your name here