sütun 1'in maksimum değerini bulun ve sütun 2'den ilgili kaydı dosyadan yazdırın


19

Sütun 1'den maksimum değeri bulma ve n yolunu içeren bir dosyadan ilgili yol konumunu yankılama.

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

Beklenen çıktı:

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

Yanıtlar:


23

Bu çalışmalı:

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

-v max=0Setleri değişken maxiçin 0, daha sonra, her hat için, birinci alan mevcut değeri ile karşılaştırılır max. Daha büyükse, max1. alanın değerine wantve geçerli satıra ayarlanır. Program tüm dosyayı işlediğinde, geçerli değeri wantyazdırılır.

Düzenle

awkÇözümü daha önce test etmedim ve bunu sağlamak benim için gerçekten kötüydü. Her neyse, cevabın düzenlenmiş versiyonu çalışmalıdır (düzeltmek için terdon sayesinde) ve ben de aşağıda test ettim.

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

Ben am sortilk alan üzerinde ing nerede,

  • -n sayısal sıralamayı belirtir.
  • -r sıralama sonucunun tersini belirtir.
  • -k1,1, sıralamanın gerçekleşmesi için ilk alanı belirtir.

Şimdi, sıralama sonra ben çıkış boru ve sadece sonuçta bana sütun1 sayısal olarak en yüksek değerini verecek ilk sonucu alıyorum.

Şimdi, sonunda cutboşluk olarak belirtilen ayırıcı -f3ile ve istenen çıktı olan baskı ile boru .

Test yapmak

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

Şimdi, yukarıdaki giriş için yukarıdaki komutu çalıştırdıktan sonra, çıktıyı şu şekilde alıyorum:

/Max/number

awk max, dize alanını sayısal olarak karşılaştırmaz. bu yüzden ikinci bir yaklaşım verdiniz mi?
Sajuuk

7

İle yapabilirsiniz AWK.

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

Burada her satırın ilk sütunu değişkenle karşılaştırılır max(başlangıçta 0'dır). İlk sütunun büyük bir değeri varsa, o maxzaman ikinci sütun değişkende saklanırsa line, bu dosyanın her satırı için devam eder.

Dosya sonunda ENDkural linedeğişkeni yazdırmak için yürütülür .


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

3

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


1
Bu çalışmalıdır, ancak verimsizdir, çünkü görev bir maksimum bulmak olduğunda sıralama aşırıdır.
jw013

2

Sadece sortkomutu kullanarak sıralayabilirsiniz

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

Çıktı:

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

ikinci değeri yazdırmak istiyorsanız sadece bu kedi version.log | sıralama -r | kafa -n1 | awk -F "" '{Print $ 2}'
Güvenlik Canavarı

Lütfen terminalinizin ekran görüntülerini yayınlamayın. Bunun yerine metni yapıştırmanız yeterlidir. Ayrıca, catsıralamaya gerek yoktur , sort doğrudan giriş dosyalarını alabilir.
terdon

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

2
Bu, kabul edilen cevabın yeniden karması gibi mi görünüyor? Lütfen nasıl farklı olduğunu açıklayın.
Stephen Rauch

Gerçekten de, en azından orijinal yazara kredi verin.
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.