2017-04-03 6 views
0

Ich habe eine Datei, die wie folgt aussieht:Drucken mehrerer Linien mit dem gleichen „größten“ Wert awk mit

3, abc, x 
2, def, y 
3, ghi, z 

Ich möchte alle Zeilen den höchsten Wert in $1 und Druck zu finden, die diesen höchsten Wert enthalten in $1.

sort -t, -k1,1n| tail -n1 

würde nur geben eine der Zeilen, die 3 in $1 enthalten, aber ich brauche beides.

Irgendwelche Vorschläge sind willkommen (:

Antwort

2

Ich bin mir nicht sicher, ob dies die schönste Art und Weise ist es, Linien zu erhalten, während sie den gleichen Wert mit awk haben, aber:

awk 'NR == 1 { t = $1; print } NR > 1 { if (t != $1) { exit; } print }' 

die kombiniert werden können mit sort wie folgt:

sort -t, -k1,1nr | awk 'NR == 1 { t = $1; print } NR > 1 { if (t != $1) { exit; } print }' 

es gibt auch das, aber es tut unnötige Arbeit:

sort -t, -k1,1nr | awk 'NR == 1 { t = $1 } t == $1 { print }' 
0

Hier ist ein weiterer Ansatz, der keine Sortierung erfordert, sondern zwei Durchläufe über die Daten erfordert.

max=$(awk -F',' '{if(max < $1) max = $1}END{print max}' Input.txt) 
awk -v max=$max -F',' '$1 == max' Input.txt 
0

In awk, nur einen Durchlauf über die Daten:

$ awk -F, ' 
$1>m {     # when new max is found 
    delete a; m=$1; i=0 # reset all 
} 
a[1]=="" || $1==m {  # if $1 equals max or we're processing the first record 
    a[++i]=$0   # store the record to a 
}   
END {     # in the end 
    for(j=1;j<=i;j++) 
     print a[j]  # print a with stored records 
}  
' file 
3, abc, x 
3, ghi, z 
Verwandte Themen