temukan nilai maksimal kolom 1 dan cetak catatan masing-masing dari kolom 2 dari file


19

Cara menemukan nilai maks dari kolom 1 dan menggema lokasi jalur masing-masing dari file yang berisi n jumlah rekaman.

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

Output yang diharapkan:

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

Jawaban:


23

Ini seharusnya bekerja:

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

The -v max=0set variabel maxuntuk 0, kemudian, untuk setiap baris, field pertama dibandingkan dengan nilai saat ini dari max. Jika lebih besar, maxdiatur ke nilai bidang 1 dan wantdiatur ke baris saat ini. Ketika program telah memproses seluruh file, nilai saat wantini dicetak.

Edit

Saya tidak menguji awksolusi sebelumnya dan itu benar-benar buruk saya untuk menyediakannya. Bagaimanapun, versi yang telah diedit dari jawaban harus bekerja (Terima kasih kepada terdon untuk memperbaikinya) dan saya menguji di bawah ini juga.

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

Saya sedang berada sortdi bidang pertama di mana,

  • -n menentukan jenis numerik.
  • -r menentukan membalikkan hasil sortir.
  • -k1,1 menentukan bidang pertama untuk penyortiran terjadi.

Sekarang, setelah pengurutan, saya mem-piping output dan hanya mendapatkan hasil pertama yang akan memberi saya nilai numerik tertinggi pada kolom1 dalam hasilnya.

Sekarang, saya akhirnya cutmengirimnya ke dengan pembatas yang ditentukan sebagai ruang dan mencetak -f3yang merupakan output yang diinginkan.

Pengujian

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

Sekarang, setelah saya menjalankan perintah di atas untuk input seperti di atas, saya mendapatkan output sebagai,

/Max/number

awk max tidak membandingkan bidang string secara numerik. Apakah itu sebabnya Anda memberi pendekatan kedua?
Sajuuk

7

Anda bisa melakukannya dengan AWK.

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

Di sini kolom pertama dari setiap baris dibandingkan dengan variabel max(yang awalnya 0). Jika kolom pertama memiliki nilai greated itu maxmaka kolom kedua disimpan dalam variabel line, ini berlanjut untuk setiap baris file.

Di akhir ENDaturan file dijalankan untuk mencetak linevariabel.


4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log

3

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


1
Ini harus bekerja tetapi tidak efisien, karena menyortir berlebihan ketika tugasnya adalah untuk menemukan yang maksimal.
jw013

2

Cukup Anda dapat mengurutkannya dengan menggunakan sortperintah

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

Keluaran:

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

Anda ingin mencetak nilai kedua hanya coba versi cat ini.log | sort -r | kepala -n1 | awk -F "" '{Print $ 2}'
Security Beast

Tolong jangan memposting tangkapan layar terminal Anda. Cukup tempel teksnya saja. Juga, tidak perlu cat, sort dapat mengambil file input secara langsung.
terdon

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

2
Ini terlihat seperti hash dari jawaban yang diterima? Tolong jelaskan bagaimana perbedaannya.
Stephen Rauch

Memang, paling tidak memberikan kredit kepada penulis asli.
Jeff Schaller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.