2012-08-13 21 views
10

Tengo un archivo con una larga lista de números enteros:Shell script: encontrar el valor máximo de una secuencia de números enteros sin clasificar

10 
4 
66 
.... 

Quiero encontrar el valor máximo utilizando herramientas de línea de comandos UNIX. Sé que puedo usar sort (y de hecho hay soluciones para este problema en SO que usan sort), pero eso es ineficiente, requiere O (N * log (N)) y mucha memoria. Con un bucle for simple, debería ser capaz de encontrar el valor máximo en O (N) y un par de bytes de memoria.

Parece que debe haber algún programa por ahí (con un nombre como max) que lo hace de la caja --- ¿es cierto?

Respuesta

24

Prueba esto:

awk '$0>x{x=$0};END{print x}' input.txt 

[actualización:]

awk 'BEGIN{x=-2147483648};$0>x{x=$0};END{print x}' input.txt 

Inicialización de x permite que la solución para manejar adecuadamente las listas de números enteros con valores < = 0. Ver comentarios para más detalles.

+0

¡Bueno! Tenga en cuenta que ';' antes de 'END' no es necesario. – fedorqui

+0

Un lugar donde esto falla. Si la lista de enteros tiene solo un valor y ese valor es 0. Su salida termina en blanco. Actualmente. Si tiene una sola lista de valores donde el valor es <= 0, está en blanco. Entonces, los negativos no funcionarán, o eso parece. En realidad ... los negativos no funcionan en absoluto con esto (valor único o no). – stuckj

+0

Tras una investigación adicional, esto falla si los únicos valores en su lista son <= 0 ya que no inicializa x. Puede resolver eso con 'awk 'BEGIN {x = <>}; $ 0> x {x = $ 0}; END {imprimir x}' 'donde <> es un número realmente negativo. Por ejemplo, 'awk 'BEGIN {x = -2147483648}; $ 0> x {x = $ 0}; END {print x}'' suponiendo una versión de awk compilada con valores de 32 bits para las variables. – stuckj

0
max=1 

while read i 
do 
    if [[ "$i" > "$max" ]]; then 
    max="$i" 
    fi 
done < a.txt 

echo "$max" > b.txt 

a.txt es el archivo de entrada (con un número entero en cada línea). b.txt contiene el máximo de los enteros en a.txt.

+0

'>' y '<' son para la clasificación léxica dentro de las pruebas. Use '(())' o 'let' en shells que los soporten, o' [n -gt m] 'para los scripts POSIX. Además, siempre use 'read -r'. Además, probablemente quieras 'max = $ i'. – ormaaj

1
awk '{if($1>a)a=$1;}END{print a}' temp3 
-1

sort -nr inputfile.txt | head -1 donde inputfile.txt contiene todos los números.

+2

mal. La pregunta fue: _ "sin ordenar" _. – benka

Cuestiones relacionadas