tìm giá trị tối đa của cột 1 và in bản ghi tương ứng từ cột 2 từ tệp


19

Cách tìm giá trị tối đa từ cột 1 và lặp lại vị trí đường dẫn tương ứng từ một tệp chứa n số bản ghi.

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

Sản lượng dự kiến:

/opt/oracle/app/oracle/product/12.1.0

Câu trả lời:


23

Điều này sẽ làm việc:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

Biến -v max=0đặt maxthành 0, sau đó, cho mỗi dòng, trường đầu tiên được so sánh với giá trị hiện tại của max. Nếu nó lớn hơn, maxđược đặt thành giá trị của trường thứ 1 và wantđược đặt thành dòng hiện tại. Khi chương trình đã xử lý toàn bộ tệp, giá trị hiện tại wantđược in.

Biên tập

Tôi đã không kiểm tra awkgiải pháp trước đó và thực sự rất tệ khi cung cấp nó. Dù sao, phiên bản chỉnh sửa của câu trả lời sẽ hoạt động (Cảm ơn terdon vì đã sửa nó) và tôi cũng đã thử nghiệm dưới đây.

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

Tôi đang sortở trên lĩnh vực đầu tiên,

  • -n chỉ định sắp xếp số.
  • -r chỉ định đảo ngược kết quả sắp xếp.
  • -k1,1 chỉ định trường đầu tiên để sắp xếp xảy ra.

Bây giờ, sau khi sắp xếp, tôi sắp xếp đầu ra và chỉ nhận được kết quả đầu tiên sẽ cho tôi giá trị cao nhất của cột1 trong kết quả.

Bây giờ, cuối cùng tôi đã chuyển nó sang cutdấu phân cách được chỉ định là khoảng trắng và in ra -f3đó là đầu ra dự định.

Kiểm tra

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

Bây giờ, sau khi tôi chạy lệnh trên cho đầu vào như trên, tôi nhận được đầu ra là,

/Max/number

awk max không so sánh trường chuỗi số. đó là lý do tại sao bạn đưa ra một cách tiếp cận thứ hai?
Sajuuk

7

Bạn có thể làm điều đó với AWK.

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

Ở đây cột đầu tiên của mỗi dòng được so sánh với biến max(ban đầu là 0). Nếu cột đầu tiên có giá trị lớn maxthì cột thứ hai được lưu trong biến line, điều này sẽ tiếp tục cho mỗi và mọi dòng của tệp.

Ở cuối ENDquy tắc tập tin được thực hiện để in linebiến.



3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
Điều này sẽ hoạt động nhưng không hiệu quả, vì sắp xếp quá mức cần thiết khi nhiệm vụ là tìm tối đa.
jw013

2

Đơn giản là bạn có thể sắp xếp nó bằng cách sử dụng sortlệnh

sort -r version.log | head -n1 | awk '{print $2}'

Đầu ra:

/opt/oracle/app/oracle/product/12.1.0

bạn muốn in giá trị thứ hai chỉ thử phiên bản con mèo này.log | sắp xếp -r | đầu -n1 | awk -F "" '{In $ 2}'
Security Beast

Xin vui lòng không đăng ảnh chụp màn hình của thiết bị đầu cuối của bạn. Chỉ cần dán văn bản thay thế. Ngoài ra, không cần cat, sắp xếp có thể lấy các tệp đầu vào trực tiếp.
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
Điều này trông giống như một băm lại câu trả lời được chấp nhận? Hãy giải thích nó khác nhau như thế nào.
Stephen Rauch

Thật vậy, ít nhất là cung cấp tín dụng cho tác giả ban đầu.
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.