2016-04-10 2 views

Antwort

1

kann ich Ihnen einige Befehlsfolge gemacht geben von sed und sort:

sed -r 's/(.*)(word_1)([^ ]+)(.*)/\3\t&/' your_file | sort -n | sed -r 's/[^\t]+\t(.*)/\1/' 
  1. die sed prepend die Zahl nach word_1 und einem Reiter vor der Zeile
  2. die Art die vorangestellte Nummer verwendet zum Sortieren
  3. Die zweite sed entfernt die vorangestellte Nummer und die Registerkarte, die ursprüngliche Zeile bleibt
1

GNU awk unterstützt das Sortieren von Arrays basierend auf Index oder Wert, siehe PROCINFO["sorted_in"] in der Manpage.

Um das zu erreichen, was Sie wollen, tun Sie etwas wie folgt aus:

sort.awk

# Sort the indices numerically descending 
BEGIN { PROCINFO["sorted_in"] = "@ind_num_desc" } 

# Use the number following "word_1" as the index in the h hash 
{ 
    for (i=1; i<=NF; i++) 
    if($i == "word_1") 
     h[$(i+1),NR] = $0 
} 

END { for(k in h) print h[k] } 

Run es wie folgt aus:

awk -f sort.awk infile 

Ausgang:

word_1 23.66 word_5 0 word_7 123 
word_7 23.7 word_2 21 word_1 3 
word_5 6 word_1 2 word_7 12 
+0

Dies überschreibt Datensätze, falls Sie mehr als einen Datensatz mit dem gleichen Wert haben. Eine Möglichkeit, dies zu bewerkstelligen, ist das Hinzufügen der Zeilennummer zum Schlüssel, d. H '[$ (i + 1), NR] = $ 0' – karakfa

+0

Schön. Ich wusste nichts über PROCINFO. –

+0

@karakfa: guter Punkt, ich werde das hinzufügen – Thor

Verwandte Themen