2012-08-13 108 views
10

Tôi có một tập tin với một danh sách dài các số nguyên:Shell script: tìm giá trị lớn nhất trong một chuỗi các số nguyên mà không sắp xếp

10 
4 
66 
.... 

Tôi muốn tìm giá trị lớn nhất sử dụng UNIX công cụ dòng lệnh. Tôi biết tôi có thể sử dụng sort (và thực sự có giải pháp cho vấn đề này trên SO sử dụng sort), nhưng đó là không hiệu quả, đòi hỏi O (N * log (N)) và nhiều bộ nhớ. Với một vòng lặp đơn giản, tôi sẽ có thể tìm thấy giá trị tối đa trong O (N) và một vài byte bộ nhớ.

Có vẻ như phải có một số chương trình ngoài đó (với tên như max) thực hiện điều này ngoài hộp --- đúng không?

Trả lời

24

Hãy thử điều này:

awk '$0>x{x=$0};END{print x}' input.txt 

[CẬP NHẬT:]

awk 'BEGIN{x=-2147483648};$0>x{x=$0};END{print x}' input.txt 

Khởi x cho phép các giải pháp xử lý đúng đắn danh sách số nguyên với giá trị < = 0. Xem bình luận để biết thêm chi tiết.

+0

Tốt nhất! Lưu ý rằng ';' trước 'END' là không cần thiết. – fedorqui

+0

Một nơi không thành công. Nếu bạn liệt kê các số nguyên chỉ có một giá trị và giá trị đó là 0. Đầu ra của bạn sẽ bị trống. Thực ra. Nếu bạn có bất kỳ danh sách giá trị duy nhất nào có giá trị <= 0 thì giá trị đó trống. Vì vậy, âm bản sẽ không hoạt động hoặc nó xuất hiện. Trên thực tế ... phủ định không làm việc ở tất cả với điều này (giá trị duy nhất hay không). – stuckj

+0

Khi điều tra thêm, điều này không thành công nếu các giá trị duy nhất trong danh sách của bạn là <= 0 vì bạn không khởi tạo x. Bạn có thể giải quyết điều đó bằng 'awk 'BEGIN {x = <>}; $ 0> x {x = $ 0}; END {print x}'' trong đó <> là một số thực sự âm. Ví dụ: 'awk' BEGIN {x = -2147483648}; $ 0> x {x = $ 0}; END {print x} ''giả định phiên bản awk được biên dịch với các giá trị 32 bit cho các biến. – stuckj

0
max=1 

while read i 
do 
    if [[ "$i" > "$max" ]]; then 
    max="$i" 
    fi 
done < a.txt 

echo "$max" > b.txt 

a.txt là tệp đầu vào (có số nguyên trên mỗi dòng). b.txt chứa tối đa các số nguyên trong a.txt.

+0

'>' và '<' là để phân loại từ vựng trong các thử nghiệm. Sử dụng '(())' hoặc 'let' trong các shell hỗ trợ chúng, hoặc' [n -gt m] 'cho các kịch bản POSIX. Ngoài ra, luôn luôn sử dụng 'read -r'. Ngoài ra, bạn có thể có nghĩa là 'max = $ i'. – ormaaj

1
awk '{if($1>a)a=$1;}END{print a}' temp3 
-1

sort -nr inputfile.txt | đầu -1 trong đó inputfile.txt chứa tất cả các số.

+2

sai. Câu hỏi là: _ "không phân loại" _. – benka

Các vấn đề liên quan