¿Por qué no funciona este script awk, donde quiero imprimir el mínimo y el máximo de una entrada con solo leer los datos una vez? También me gustaría inicializar la variable min y max con el primer valor de los datos.
Di que tengo un archivo
a 14 a 34 a 234 a 2345 a 1 a 24Estoy usando awk para imprimir el mínimo y el máximo con:
cat test.txt | awk 'BEGIN {min=$2; max=$2} {if ($2 < min) {min=$2}; if ($2 > max) {max=$2} } END {print "min: " min "max: " max}'Pero estoy obteniendo un resultado de:
min: max: 2345No entiendo por qué min está en blanco.
Hola! Ahora supongamos que tengo una lista con 8 columnas aprox. y quiero imprimir el maximo y el minimo de la columna 5 por ejemplo. Como tendria que hacer?
El bloque BEGIN {} se procesa antes de la primera línea, por lo que $2 no está definido.
$ cat file a 14 a 34 a 234 a 2345 a 1 a 24 $ awk 'NR == 1 { min = max = $2; next } $2 > max { max = $2 } $2 < min { min = $2 } END { print "min: " min ", max: " max }' file min: 1, max: 2345Todos los valores numéricos en awk se almacenan en formato de punto flotante y no hay equivalentes a C INT_MIN , INT_MAX , por lo que simplemente debe elegir el rango de valores que desea manejar e inicializar su max al valor mínimo posible en el rango desea considerar y min hasta el valor máximo posible en el rango que desea considerar.
Para valores enteros con signo, simplemente elegir los valores mínimos/máximos para un entero con signo de 32 bits es razonable. Por ejemplo, puedes hacer:
awk ' BEGIN { min=2147483647; max=-2147483648 } $2 > max { max=$2 } $2 < min { min=$2 } END { print "max: ", max ORS "min: ", min } ' fileEjemplo de uso/resultado
Con sus datos en file , obtendría:
$ awk ' > BEGIN { min=2147483647; max=-2147483648 } > $2 > max { max=$2 } > $2 < min { min=$2 } > END { print "max: ", max ORS "min: ", min } > ' file max: 2345 min: 1Que es lo que estabas buscando.