znajdź maksymalną wartość w kolumnie 1 i wydrukuj odpowiedni rekord z kolumny 2 z pliku


19

Jak znaleźć maksymalną wartość z kolumny 1 i powtórzyć odpowiednią lokalizację ścieżki z pliku zawierającego n liczby rekordów.

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

Oczekiwany wynik:

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

Odpowiedzi:


23

To powinno działać:

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

Do -v max=0ustawia zmienną maxdo 0, a następnie dla każdej linii, pierwsze pole jest porównywana z wartością bieżącą max. Jeśli jest większa, maxjest ustawiona na wartość pierwszego pola i wantna bieżącą linię. Gdy program przetworzy cały plik, wantdrukowana jest bieżąca wartość parametru .

Edytować

Nie testowałem awkwcześniej rozwiązania i naprawdę było mi bardzo źle, że je dostarczyłem. W każdym razie edytowana wersja odpowiedzi powinna działać (dzięki terdon za naprawienie) i przetestowałem również poniższe.

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

Jestem sortna pierwszym polu, gdzie

  • -n określa sortowanie numeryczne.
  • -r określa odwrotny wynik sortowania.
  • -k1,1 określa pierwsze pole do przeprowadzenia sortowania.

Teraz, po posortowaniu, przesyłam dane wyjściowe i po prostu otrzymuję pierwszy wynik, który da mi najwyższą liczbowo wartość kolumny 1 w wyniku.

Teraz w końcu podłączam do niego rurkę cutz ogranicznikiem określonym jako spację i wypisuję -f3zamierzony wynik.

Testowanie

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

Teraz, po uruchomieniu powyższej komendy dla danych wejściowych jak powyżej, otrzymuję dane wyjściowe jako,

/Max/number

awk max nie porównuje liczbowo pola ciągu. czy dlatego podjąłeś drugie podejście?
Sajuuk

7

Możesz to zrobić za pomocą AWK.

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

Tutaj pierwsza kolumna każdego wiersza jest porównywana ze zmienną max(która początkowo wynosi 0). Jeśli pierwsza kolumna ma wartość greated, maxa następnie druga kolumna jest przechowywana w zmiennej line, jest to kontynuowane dla każdego wiersza pliku.

Na końcu ENDreguły pliku jest wykonywana, aby wydrukować linezmienną.


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

3

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


1
Powinno to działać, ale jest nieefektywne, ponieważ sortowanie to przesada, gdy zadaniem jest znalezienie maksimum.
jw013

2

Po prostu możesz to posortować za pomocą sortpolecenia

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

Wynik:

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

chcesz wydrukować drugą wartość, wypróbuj tylko tę wersję cat.log | sort -r | głowa -n1 | awk -F "" "{Drukuj 2 USD}"
Security Beast

Nie publikuj zrzutów ekranu swojego terminala. Zamiast tego wklej tekst. Ponadto nie ma potrzeby cat, sort może bezpośrednio pobierać pliki wejściowe.
terdon

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

2
To wygląda na powtórne sprawdzenie zaakceptowanej odpowiedzi? Proszę wyjaśnić, jak to się różni.
Stephen Rauch,

Rzeczywiście, przynajmniej uznanie autora oryginalnego.
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.