AWK: cómo contar todos los números en un archivo usando funciones

AWK: cómo contar todos los números en un archivo usando funciones

Estoy un poco confundido porque mi patrón funciona si no uso funciones. Por otro lado no es así.

Fichero de entrada:

asd
111
22
3333
mike
44444
mas

Mi función awk: (siempre imprime 1 en lugar de 4)

function A(){
/[0-9]/ number++
print number
}

END{
A()
}

El patrón funciona si lo uso fuera de la función pero dentro siempre se imprime 1, ¿cuál es el problema?

Respuesta1

Un patrón como el /[0-9]/que no se suele utilizar.adentroun bloque. Se utilizan más comúnmente como

pattern { block }

Si desea probar una expresión regular con una cadena dentro de una función, use match():

function A() {
    if (match($0, "[0-9]"))
        ++number
}

{
    A()
}

END {
    print number
}

Esto contaría el número de líneas que contienen al menos un dígito llamando A()a cada línea. La función A()compararía la [0-9]expresión regular con el contenido de la línea y aumentaría numberen uno si coincide. El ENDbloque imprime el resultado numberal final de la ejecución.

En lugar de if (match($0, "[0-9]")), también puedes usar if (/[0-9]/), pero match()es más flexible.

Esto tiene el mismo efecto que el awkprograma.

/[0-9]/ { ++number }

END     { print number }

Si desea contar el número de líneas que contienen solo un número entero positivo (en lugar de líneas que contienen un dígito en alguna parte), utilícela ^[0-9]+$como expresión regular.

El punto principal es que la función A()debe llamarse para cada línea de entrada y que el numbervalor de la variable debe imprimirse en el ENDbloque.


La siguientesintaxises aceptado por elawkgramática POSIX, pero el programa sin embargonocontaría el número de líneas que contienen un dígito, pero contaría el número de líneas.

function A() {
    /[0-9]/ ++number
}

{
    A()
}

END {
    print number
}

La declaración /[0-9]/ ++numberse evaluaría como el carácter 0o 1(dependiendo de si la línea actual coincide) concatenado con el resultado de ++numbercomo una cadena.

Dado que llama a su A()función solo en el ENDbloque, numberse incrementará exactamente una vez, y es por eso que siempre obtiene 1como salida.

información relacionada