
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 number
en uno si coincide. El END
bloque imprime el resultado number
al 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 awk
programa.
/[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 number
valor de la variable debe imprimirse en el END
bloque.
La siguientesintaxises aceptado por elawk
gramá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]/ ++number
se evaluaría como el carácter 0
o 1
(dependiendo de si la línea actual coincide) concatenado con el resultado de ++number
como una cadena.
Dado que llama a su A()
función solo en el END
bloque, number
se incrementará exactamente una vez, y es por eso que siempre obtiene 1
como salida.