Finden Sie den Maximalwert von Spalte 1 und drucken Sie den entsprechenden Datensatz aus Spalte 2 aus der Datei


19

So ermitteln Sie den Maximalwert aus Spalte 1 und geben den jeweiligen Pfad aus einer Datei mit n Datensätzen aus.

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

Erwartete Ausgabe:

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

Antworten:


23

Das sollte funktionieren:

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

Das -v max=0setzt die Variable maxauf 0, dann wird für jede Zeile das erste Feld mit dem aktuellen Wert von verglichen max. Wenn es größer ist, maxwird auf den Wert des 1. Feldes gesetzt und wantauf die aktuelle Zeile gesetzt. Wenn das Programm die gesamte Datei verarbeitet hat, wird der aktuelle Wert von wantgedruckt.

Bearbeiten

Ich habe die awkLösung nicht früher getestet und es war wirklich schlecht, sie zur Verfügung gestellt zu haben. Wie auch immer, die bearbeitete Version der Antwort sollte funktionieren (danke an terdon für die Fehlerbehebung) und ich habe auch das Folgende getestet.

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

Ich bin sortauf dem ersten Feld, wo,

  • -n gibt die numerische Sortierung an.
  • -r gibt an, dass das Sortierergebnis umgekehrt werden soll.
  • -k1,1 gibt das erste Feld für die Sortierung an.

Nach dem Sortieren leite ich nun die Ausgabe weiter und erhalte nur das erste Ergebnis, das mir den numerisch höchsten Wert von Spalte1 im Ergebnis gibt.

Jetzt leite ich es cutmit dem als Leerzeichen angegebenen Trennzeichen weiter und drucke das, -f3was die beabsichtigte Ausgabe ist.

Testen

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

Nachdem ich den obigen Befehl für die Eingabe wie oben ausgeführt habe, erhalte ich die Ausgabe als

/Max/number

awk max vergleicht das Stringfeld nicht numerisch. haben Sie deshalb einen zweiten Ansatz gewählt?
Sajuuk

7

Sie können es mit tun AWK.

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

Hier wird die erste Spalte jeder Zeile mit der Variablen max(die anfänglich 0 ist) verglichen . Wenn die erste Spalte einen Wert hat, der größer ist als der Wert, maxder in der Variablen linefür die zweite Spalte gespeichert ist , wird dies für jede einzelne Zeile der Datei fortgesetzt.

Am Ende der Datei wird die ENDRegel ausgeführt, um die lineVariable zu drucken .


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

3

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


1
Dies sollte funktionieren, ist aber ineffizient, da das Sortieren zu viel kostet, wenn es darum geht, ein Maximum zu finden.
JW013

2

Einfach können Sie es sortieren, indem Sie sortBefehl verwenden

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

Ausgabe:

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

Wenn Sie den zweiten Wert drucken möchten, versuchen Sie es mit dieser Katze version.log | sort -r | head -n1 | awk -F "" '{Print $ 2}'
Sicherheitstier

Bitte posten Sie keine Screenshots Ihres Terminals. Fügen Sie stattdessen einfach den Text ein. Es ist auch nicht erforderlich cat, dass sort Eingabedateien direkt übernehmen kann.
Terdon

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

2
Dies sieht aus wie ein erneuter Hash der akzeptierten Antwort? Bitte erläutern Sie den Unterschied.
Stephen Rauch

In der Tat, zumindest den ursprünglichen Autor zu würdigen.
Jeff Schaller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.