2013-04-25 1 views
8

Ich habe eine Datei, die Zahlen in der ersten Spalte hat.Unix Shell finde die Max und Min Werte und drucke die Zeile aus einer Datei

100,red 
101,blue 
102,black 

Ich sollte ein Shell-Skript schreiben, dass es die Zeile mit den Max- und Min-Zahlen drucken wird.

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 

Dies ist, was ich bisher versucht, die max.

+0

einen sehr "teuer" Weg, um Ihre Linien zu analysieren und warum du schaust dir '... awk '{print $ 3}'' ... du hast nur 2 Elemente? @sudo_O ist richtig, awk ist hier am besten, aber wenn du nur versuchst Shell-Coding zu lernen, dann reduziere es auf 'while read fir sec; tue, wenn [$ fir .... done shellter

+0

'max' wird in einer von der Pipeline induzierten Subshell gesetzt. Ändere einfach zu 'while read LINE; machen ...; Fertig chepner

Antwort

5

Sie sollten nur in awk die ganze Sache tun, wenn Sie GNU awk haben:

und die erste und letzte Zeile drucken Vorsortierung
$ 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 

Alternativ:

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

Wenn Sie nicht tun :

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

danke, aber ich bekomme eine 'Funktion asorti nie definiert' Fehler, auch ich möchte die gesamte Zeile drucken, nicht nur die Nummer. – hackio

+0

In welchem ​​System arbeiten Sie? Sie haben nicht "GNU awk" scheint es. –

+0

Sekunde funktioniert gut, aber tut mir leid, dass ich etwas vergessen habe, dass ich ein Komma zwischen den Zahlen und Farben habe. – 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 

Erstellen Sie ein Array mit den sortierten Elementen. Erste und letzte Elemente sind, welche die Min- und Max-Wert

+1

Sie wollen auf dem ersten Feld sortieren "sort -t", "-nk1 file". –

11

Alternativ Sortierung verwenden und Sed

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

-n flag - sortiert als Zahlen.

Wie man es verwendet:

$ 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

Dies ist eine einfache und elegante Lösung! – BioCoder

17

Für min Wert:

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

Für max-Wert:

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