2012-08-13 9 views
10

Ho un file con una lunga lista di numeri interi:script di shell: trovare il valore massimo in una sequenza di numeri interi senza ordinare

10 
4 
66 
.... 

voglio trovare il valore massimo utilizzando gli strumenti della riga di comando UNIX. So che posso usare sort (e in effetti ci sono soluzioni a questo problema su SO che usano sort), ma questo è inefficiente, richiede O (N * log (N)) e molta memoria. Con un ciclo for semplice, dovrei essere in grado di trovare il valore massimo in O (N) e un paio di byte di memoria.

Sembra che ci sia qualche programma là fuori (con un nome come max) che lo faccia fuori dalla scatola --- è vero?

risposta

24

Prova questo:

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

[Aggiornamento:]

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

inizializzazione x permette alla soluzione di gestire correttamente le liste con i valori interi < = 0. vedere i commenti per maggiori dettagli.

+0

Buono! Notare che ';' prima di 'END' non è necessario. – fedorqui

+0

Un posto dove questo fallisce. Se l'elenco di numeri interi ha solo un valore e tale valore è 0. L'output finisce vuoto. In realtà. Se hai una lista di valori singoli in cui il valore è <= 0, è vuoto. Quindi, i negativi non funzioneranno o apparirà. In realtà ... i negativi non funzionano affatto con questo (valore singolo o no). – stuckj

+0

In seguito a ulteriori indagini, ciò non riesce se gli unici valori nell'elenco sono <= 0 poiché non si inizializza x. Puoi risolvere ciò con 'awk 'BEGIN {x = <>}; $ 0> x {x = $ 0}; END {print x}'' dove <> è un numero davvero negativo. Ad esempio, 'awk 'BEGIN {x = -2147483648}; $ 0> x {x = $ 0}; END {print x}'' assumendo una versione di awk compilata con valori a 32 bit per variabili. – stuckj

0
max=1 

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

echo "$max" > b.txt 

a.txt è il file di input (con un numero intero su ogni riga). b.txt contiene il massimo degli interi in a.txt.

+0

'>' e '<' sono per l'ordinamento lessicale all'interno dei test. Usa '(())' o 'let' nelle shell che li supportano, o' [n -gt m] 'per gli script POSIX. Inoltre, usa sempre 'read -r'. Inoltre, probabilmente intendevi "max = $ i". – ormaaj

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

inputfile.txt sorta -nr | head -1 dove inputfile.txt contiene tutti i numeri.

+2

sbagliato. La domanda era: _ "senza selezione" _. – benka

Problemi correlati