2013-04-25 18 views
8

Ho un file che ha numeri nella prima colonna.shell Unix che trova i valori massimo e minimo e stampa la linea da un file

100,red 
101,blue 
102,black 

Dovrei scrivere uno script di shell che stamperà la riga con i numeri max e min.

max=0 
cat file.txt|while read LINE 
do 
    fir=`echo $LINE|awk '{print $2}'` 
    sec=`echo $LINE|awk '{print $3}'` 
    if [ $fir -gt $max ]; then 
     max=$fir 
    fi 
    if [ $sec -gt $max ];then 
     max=$sec 
    fi 
done 

grep $max file.txt 

Questo è quello che ho provato finora per trovare il massimo.

+0

un modo molto "costoso" per analizzare le linee e il motivo per cui sono stai guardando '... awk '{print $ 3}'' ... hai solo 2 elementi? @sudo_O ha ragione, awk è il migliore qui, ma se stai solo provando a imparare la codifica della shell, ridurla a 'mentre leggi fir sec; fai se [$ fir .... fatto shellter

+0

'max' viene impostato in una sottoshell indotta dalla pipeline. Basta cambiare in 'mentre leggi LINE; fare ...; fatto chepner

risposta

5

Si dovrebbe solo fare il tutto in awk se avete GNU awk:

$ awk -F, '{a[$1]=$0}END{asorti(a,b);print a[b[1]]"\n"a[b[NR]]}' file 
100,red 
102,black 

Se non lo fai:

$ awk -F, 'NR==1{s=m=$1}{a[$1]=$0;m=($1>m)?$1:m;s=($1<s)?$1:s}END{print a[s]"\n"a[m]}' file 
100,red 
102,black 

alternativa presort e stampare la prima e l'ultima riga :

$ sort -t',' -nk1 file | awk 'NR==1;END{print}' 
100,red 
102,black 
+0

grazie, ma ottengo un errore 'funzione asorti mai definito', inoltre voglio stampare l'intera riga, non solo il numero. – hackio

+0

Che sistema stai? A quanto pare non hai "GNU awk". –

+0

la seconda funziona alla grande, ma mi dispiace per aver dimenticato qualcosa che ho una virgola tra numeri e colori – hackio

2
[bash]$ cat log 
100,red 
101,blue 
102,black 
[bash]$ all=($(sort log | cut -f1 -d',')) 
[bash]$ echo "MIN: ${all[0]} and MAX: ${all[${#all[@]}-1]}" 
MIN: 100 and MAX: 102 

Creare un array utilizzando gli elementi ordinati. elementi primi e ultimi vengono contenenti minimi e massimi valori

+1

Vuoi essere ordinamento numerico sul primo campo 'sort -t ',' -nk1 file'. –

11

alternativa usando ordinamento e sed

$ sort -n id | sed -n '1p;$p' 
100 red 
102 black 

-n flag - ordinamento come numeri.

Come si usa:

$ a=($(sort -n id | sed -n '1s/^\([0-9]\+\).*$/\1/p;$s/^\([0-9]\+\).*$/\1/p')) 
$ echo "min=${a[0]}, max=${a[1]}" 
min=100, max=102 
+0

Questa è una soluzione semplice ed elegante! – BioCoder

17

Per il valore min:

[bash]$ cut -f1 -d"," file_name | sort -n | head -1 

Per valore massimo:

[bash]$ cut -f1 -d"," file_name | sort -n | tail -1 
Problemi correlati