2013-04-25 12 views
8

Mam plik, który ma numery w pierwszej kolumnie.Powłoka uniksowa ustalająca wartości maksymalne i minimalne oraz drukowanie linii z pliku

100,red 
101,blue 
102,black 

Powinienem napisać skrypt powłoki, który wydrukuje linię z numerami maks. I 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 

Oto, czego próbowałem do tej pory, aby znaleźć maks.

+0

bardzo "kosztowny" sposób analizować swoje linie i dlaczego patrzysz na '... awk '{print $ 3}'' ... masz tylko 2 elementy? @sudo_O ma rację, awk jest najlepszy tutaj, ale jeśli próbujesz nauczyć się kodowania powłoki, zmniejsz ją do 'while read fir sec; zrobić, jeśli [$ fir .... done shellter

+0

'max' ustawia się w podpowłoce wywołanej przez potok. Po prostu zmień na 'while read LINE; robić ...; done chepner

Odpowiedz

5

Trzeba tylko zrobić całość w awk jeśli masz GNU awk:

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

Jeśli nie:

$ 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 

Alternatywnie presort i wydrukować pierwszą i ostatnią linię :

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

dziękuję, ale dostaję komunikat "funkcja asorti nigdy nie zdefiniowałem", również chcę wydrukować całą linię, a nie tylko liczbę. – hackio

+0

Jakiego systemu używasz? Nie masz "GNU awk", jak się wydaje. –

+0

Druga działa wspaniale, ale przepraszam za zapomnienie czegoś, co mam przecinek między liczbami a kolorami – 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 

Utwórz tablicę za pomocą posortowanych elementów. Pierwsze i ostatnie elementy zawierające minimalną i maksymalną

+1

Chcesz sortować numerycznie na pierwszym polu 'sort-t ',' -nk1 file'. –

11

Alternatywnie za pomocą rodzaju oraz sed

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

-n flagi - rodzaj numery.

Jak go używać:

$ 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

To proste i eleganckie rozwiązanie! – BioCoder

17

Dla wartości min:

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

Dla wartości MAX:

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