2013-08-06 14 views
10

Come ottenere la massima "velocità" e il corrispondente valore "log2c" da un file come segue? ad esempio la velocità massima è 89.5039 e log2c 3.0. molte grazie.come ottenere il numero massimo da un file con script di shell bash Linux

log2c=5.0 rate=88.7619 
log2c=-1.0 rate=86.5412 
log2c=11.0 rate=86.1482 
log2c=3.0 rate=89.5039 
log2c=-3.0 rate=85.5614 
log2c=9.0 rate=81.4302 
+1

C'è un motivo per cui non lo fai in Awk? Questo dovrebbe essere banale dopo solo un breve tutorial introduttivo. – tripleee

+0

La soluzione di devnull funziona perfettamente in bash. Tuttavia, il mio nome file di input proviene da un nomefile $ varable. Quindi, ho messo queste parole in eco "..." | sh. perdonami, sono un principiante. – Eman

risposta

12

Uso sort:

sort -t= -nr -k3 inputfile | head -1 

Per l'ingresso data, esso sarebbe tornato:

log2c=3.0 rate=89.5039 

Se volete leggere i valori in variabili, è possibile utilizzare la funzione interna read :

$ IFS=$' =' read -a var <<< $(sort -t= -nr -k3 inputfile | head -1) 
$ echo ${var[1]} 
3.0 
$ echo ${var[3]} 
89.5039 
+0

Quindi, come ottenere 89.5039 e 3.0, grazie. – Eman

+0

@ user79883 vedi modifica sopra. – devnull

+0

o 'IFS = $ '=' leggere log2c inutilizzato tasso inutilizzato <<< "$ (in ordine -t = -nr -K3 InputFile | testa -1)"' – anishsane

4

Per file di grandi dimensioni, l'utilizzo di sort sarà piuttosto lento. In questo caso, è meglio usare qualcosa come awk, che richiede un solo passaggio:

$ awk -F= 'BEGIN { max = -inf } { if ($3 > max) { max = $3; line = $0 } } END { print line }' test.txt 
log2c=3.0 rate=89.5039 

La complessità temporale di questa operazione è lineare, mentre la complessità spazio è costante (e piccolo). Spiegazione:

  1. awk -F= '...' test.txt: Richiamare awk su test.txt, utilizzando = come separatore di campo
  2. BEGIN { max = -inf }: Inizializzare max a qualcosa che sarà sempre più piccolo di quello che stai leggendo.
  3. { if ($3 > max) { max = $3; line = $0; } }: Per ciascuna linea di ingresso, se max è inferiore al valore del terzo campo ($3), quindi aggiornarla e ricordare il valore della riga corrente ($0)
  4. END { print line }: Infine, stampare la linea che ricordato durante la lettura dell'input.
+0

Non ha funzionato sul mio linux né su max con gawk 4.1.4, a meno che non si sostituisca "print line" con "print $ line" –

Problemi correlati