2016-07-28 11 views
0

Ich versuche, eine Textdatei wie folgtfinden ersten 5 Maximalwerte in jeder Zeile mit awk

word 1 2 3 4 5 6 7 8 9 10 
hello 0.2 0.3 0.5 0.1 0.7 0.8 0.6 0.1 0.9 

ich das Wort drucken möchten zu lesen, „Hallo“ und die maximun 5 Werte zusammen mit die Nummer der Spalte, wo sie, wie diese mit awk sind:

hello 10 0.9 7 0.8 6 0.7 8 0.6 3 0.5 

ich habe so etwas wie diese awk '{ for (i=1; i <= 10; i++) a[$i]=$i};END{c=asort(a)?? for(i in a)print i,a[i]??}' gedacht, aber ich würde in jeder Zeile drucken mag lesen.

Antwort

0

Sie erklärte [Sie] würden in jeder Zeile drucken möchten lesen so keine Grenzen gesetzt Register:

$ awk '{delete a; for(i=2; i<=NF; i++) {a[$i]=$i; b[$i]=i}; n=asort(a); printf "%s: ",$1; for(i=n; i>n-(n>=5?5:n); i--) printf "%s %s ", b[a[i]], a[i]; printf "\n"}' test.in 
word: 11 10 10 9 9 8 8 7 7 6 
hello: 10 0.9 7 0.8 6 0.7 8 0.6 4 0.5 

Weg-thru-Version:

{ 
    delete a      # delete the array before each record 
    for(i=2; i<=NF; i++) {   # from the second field to the last 
    a[$i]=$i      # set field to array index and value 
    b[$i]=i      # remember the field number 
    } 
    n=asort(a)      # sort the a array 
    printf "%s: ",$1    # print the record identifier ie. the first field 
    for(i=n; i>n-(n>=5?5:n); i--) # for the 5 (or value count) biggest values 
    printf "%s %s", b[a[i]], a[i] # print them out 
    printf "\n"      # enter after each record 
} 

Wenn ein Wert wiederholt, Es wird nur einmal gedruckt.

0

Hier ist eine awk unterstützt Unix-Tool-Set-Lösung.

$ awk -v RS=" " 'NR==1; NR>1{print NR, $0 | "sort -k2nr"} ' file | head -6 | xargs 
hello 10 0.9 7 0.8 6 0.7 8 0.6 4 0.5 

Ich denke, Ihre erwartete Ausgabe hat einige Tippfehler.

+0

Vielen Dank, und es gibt eine Möglichkeit, um statt 'Kopf -6', die nur die ersten 6 Spalten in 1 Zeile drucken, druckt 6 Spalten aber mit allen Zeilen (ich meine wenn es mehr gibt)? –

+0

Sorry, ich habe gesucht und weiß jetzt, dass ich es mit 'cut -f 1-6' machen kann. –

+0

Es ist nicht möglich, diese Ausgabe von diesem Skript zu erhalten, wenn die Posted-Input-Eingabe erfolgt. IDK wenn sich etwas geändert hat ... –

1

Mit GNU awk 4. * für sorted_in:

$ cat tst.awk 
BEGIN { PROCINFO["sorted_in"] = "@val_num_desc" } 
NR>1 { 
    split($0,a) 
    printf "%s", a[1] 
    delete a[1] 
    for (i in a) { 
     printf " %d %s", i, a[i] 
     if (++c == 5) { 
      c=0 
      break 
     } 
    } 
    print "" 
} 

$ awk -f tst.awk file 
hello 10 0.9 7 0.8 6 0.7 8 0.6 4 0.5 
Verwandte Themen