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 cat
Einlesen 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 cat
zu 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, sort
dass bei Spalte 3, Zeichen 1 begonnen werden soll, da sort immer ein Leerzeichen als Trennzeichen behandelt. Man kann die Eingabedatei natürlich sort
auch 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