Suchen Sie den Maximalwert von Spalte 3 und drucken Sie nur die Werte von Spalte 1 und 2

Suchen Sie den Maximalwert von Spalte 3 und drucken Sie nur die Werte von Spalte 1 und 2

Unter Unix versuche ich, einen Befehl zu finden, der den Maximalwert in Spalte 3 findet und die entsprechenden Werte aus Spalte 2 und Spalte 1 (aber nicht aus Spalte 3) in eine neue Datei druckt.

 Column1     Column2     Column3
   A          1          25
   B          2          6
   C          3          2
   D          4          16
   E          5          10

Wie sollte der Unix-Befehl lauten? Soll ich grep, awk oder datamash verwenden?

Antwort1

Ich würde verwenden awk. Vorausgesetzt, die Daten sind genau wie Ihre Beispieldaten formatiert, erzeugt das Folgende die gewünschte Ausgabe:

awk -v MAX=0 '{ if(NR>1 && $3>MAX){WANT1=$1; WANT2=$2; MAX=$3}} END{print WANT1, WANT2}' infile > outfile

Antwort2

Vorausgesetzt, Ihre Daten sind genau wie von Ihnen angegeben formatiert (das gilt insbesondere für die 3. Spalte, alle Zahlen sind linksbündig ausgerichtet) und diese Daten werden durch catEinlesen einer Datei bereitgestellt, können Sie diesen Befehl versuchen:

*input generating command* | sort -nrk3 | awk '{print $1 " " $2}' > output_file

Falls Ihre Daten von einem anderen Befehl oder einer anderen Quelle bereitgestellt werden, wechseln Sie catzu diesem anderen Befehl. Weitere Informationen finden Sie unterdieser Beitragdie ich grundsätzlich nur auf Deine Bedürfnisse zugeschnitten habe.

Bearbeiten:

Ich habe den obigen Befehl leicht geändert, da es nicht notwendig ist, anzugeben, sortdass bei Spalte 3, Zeichen 1 begonnen werden soll, da sort immer ein Leerzeichen als Trennzeichen behandelt. Man kann die Eingabedatei natürlich sortauch direkt angeben, wie ein Benutzer anmerkte. Wenn auch die Header Teil Ihrer Daten sind, ändern Sie den obigen Befehl wie folgt:

*input generating command* | sort -nrk3 | awk '{if (NR>1) print $1 " " $2}' > output_file

Antwort3

awk '{if(NF>2 && $3>M){M=$3;print $1,$2} }' file1 | tail -1 > file2

verwandte Informationen