2013-04-25 17 views
8

Tôi có tệp có số ở cột đầu tiên.Vỏ Unix tìm giá trị lớn nhất và tối thiểu và in dòng từ một tệp

100,red 
101,blue 
102,black 

Tôi nên viết tập lệnh hệ vỏ để in dòng có số tối đa và số phút.

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 

Đây là những gì tôi đã cố gắng cho đến nay để tìm giá thầu CPC

+0

một cách rất "đắt" để phân tích dòng của bạn và tại sao bạn nhìn vào '... awk '{print $ 3}'' ... bạn chỉ có 2 phần tử? @sudo_O là đúng, awk là tốt nhất ở đây, nhưng nếu bạn chỉ cố gắng tìm hiểu mã hóa shell, sau đó giảm nó thành 'trong khi đọc fir sec; làm nếu [$ fir .... done shellter

+0

'max' đang được đặt trong một vỏ bọc phụ được gây ra bởi đường ống. Chỉ cần thay đổi thành 'while read LINE; làm ...; xong chepner

Trả lời

5

Bạn chỉ nên làm toàn bộ điều trong awk nếu bạn có GNU awk:

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

Nếu bạn không:

$ 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 

Ngoài ra presort và in dòng đầu tiên và cuối cùng :

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

cảm ơn bạn, nhưng tôi nhận được một 'chức năng asorti không bao giờ được xác định' lỗi, tôi cũng muốn in toàn bộ dòng, không chỉ số lượng. – hackio

+0

Bạn đang sử dụng hệ thống nào? Bạn không có 'GNU awk' có vẻ như vậy. –

+0

thứ hai hoạt động tốt, nhưng xin lỗi vì đã quên thứ gì đó mà tôi có dấu phẩy giữa các số và màu sắc – 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 

Tạo một mảng bằng cách sử dụng các yếu tố được sắp xếp. yếu tố đầu tiên và cuối cùng được chứa min và max giá trị

+1

Bạn muốn sắp xếp số trên trường đầu tiên 'sort -t ',' -nk1 file'. –

11

Ngoài ra sử dụng sắp xếp và sed

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

-n cờ - loại như số.

Làm thế nào để sử dụng 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

Đây là một giải pháp đơn giản và thanh lịch! – BioCoder

17

Đối với giá trị tối thiểu:

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

Đối với giá trị tối đa:

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