2013-04-25 154 views
8

我有一個文件,它在第一列有數字。查找最大值和最小值並從文件中打印行的Unix shell

100,red 
101,blue 
102,black 

我應該編寫一個shell腳本,它將打印最大和最小數字的行。

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 

這就是我迄今爲止的嘗試尋找最大。

+0

一個非常 「昂貴」 的方式來解析你的線條和爲什麼你在看......'awk'{print $ 3}''......你只有2個元素? @sudo_O是對的,awk在這裏最好,但是如果你只是想學習shell編碼,那麼把它減少到'while fir sec;如果[$ fir .... done shellter 2013-04-25 10:43:48

+0

'max'被設置在由管道引發的子shell中。只需改爲'while while read LINE;做...;完成 chepner 2013-04-25 14:03:15

回答

5

你應該只是整個事情awk如果你有GNU awk

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

如果不這樣做:

$ 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 

或者與預先分類打印第一和最後一行:

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

謝謝,但我得到'函數asorti從未定義'的錯誤,我也想打印整個行,不僅是數字。 – hackio 2013-04-25 10:37:01

+0

你在什麼系統上?你看起來沒有'GNU awk'。 – 2013-04-25 10:37:42

+0

第二個工程很好,但遺憾忘記了我在數字和顏色之間有一個逗號的東西 – hackio 2013-04-25 10:48:09

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 

使用排序後的元素創建一個數組。第一和最後的元件被包含最小值和最大值

+1

您想要在第一個字段'sort -t','-nk1 file'上對數字進行排序。 – 2013-04-25 10:56:32

11

替代地使用排序和sed

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

-n標誌 - 排序爲數字。

如何使用它:

$ 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

這是一個簡單而優雅的解決方案! – BioCoder 2016-05-09 06:36:00

17

對於最小值:

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

對於最大值:

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