2009-06-28 12 views
0

Ich brauche deine Hilfe. Lassen Sie mich Ihnen sagen, was mein Problem ist. Ich habe eine Textdatei wie folgt:Sortierung, um eine Spalte nach ihrer Größe zu sortieren

Music 3.6G 
Other 254.5M 
Videos 4.6G 
Games 1.3G 
Apps 10.1G 

Wie Sie die Datei hat zwei Spalten zu sehen, die von Verzeichnisnamen und ihre entsprechenden Größen bestehen.

Was ich tun möchte, ist diese Datei-Verzeichnis Größe sortieren in abnehmender Reihenfolge wie folgt aus:

Apps 10.1G 
Videos 4.6G 
Music 3.6G 
Games 1.3G 
Other 254.5M 

Gibt es eine Möglichkeit, dies zu erreichen? Gibt es dafür einen One-Liner-Befehl?

DANKE.

+1

Es gibt mehrere Lösungen in dieser Frage: http://stackoverflow.com/questions/586033/how-can-i-sort-du-h-output-by-size – Drakosha

+0

gut, aber ich muss die Textdatei ändern Inhalt .. – GuleLim

+0

Was ist die Ausgabe für ein Verzeichnis, das nur eine Datei von 4 KiB enthält? Eine Datei mit 10.6 KiB? –

Antwort

0

Überprüfen Sie die Sortierman-Seite.

Um die Datei unten auf dem dritten Feld (Vorwahl) zu sortieren:
Jim Alchin 212121 Seattle
Bill Gates 404404 Seattle
Steve Jobs 246810 Nevada
Scott Neally 212277 Los Angeles
Art $ -k 3,3 people.txt> sorted.txt

Sort (rückwärts) numerisch in absteigender Reihenfolge:
$ sort -nr

0

Mit Perl:

perl -nle'$G{$2}=$1 if/(\w+) (\d+\.?\d*)G/;$M{$2}=$1 if/(\w+) (\d+\.?\d*)M/;$K{$2}=$1 if/(\w+) (\d+\.?\d*)K/;END{print"$G{$_} ${_}G"for sort{$b<=>$a}keys%G;print"$M{$_} ${_}M"for sort{$b<=>$a}keys%M;print"$K{$_} ${_}K"for sort{$b<=>$a}keys%K;}' filename 

Hier filename ist eine Datei, die die oben genannten Daten enthält. Der obige Einstrich übernimmt die Einheiten G, M und K.

Eine weitere Implementierung unter Verwendung kürzere eval:

perl -nle'/(\w+) (\d+\.?\d*)(\w)/;eval"\$\$3{$2} = $1";END{for$u qw(G M K){eval"print\"\$\$u{$_} $_$u\""for sort{$b<=>$a}keys%{$u}}}' filename 
+0

Ich kann Perl nicht installieren :( – GuleLim

+0

Welche Art von System verwenden Sie? –

+0

Ernsthafter, behandelt das Skript nicht M als ein Suffix. –

0
sort -n -r -k 2,2 file.txt 

-k 2,2 Mittel das zweite Feld in der Datei als das Sortierfeld. Standardmäßig verwendet sort Leerzeichen, um Felder zu trennen. Dies funktioniert möglicherweise nicht, wenn die Suffixe auf den Feldern (G in Ihrem Beispiel für Gigabyte) unterschiedlich sind.

+0

gut Suffixe auf den Feldern sind anders :( Ich habe nicht die vollständige Liste geschrieben – GuleLim

1

Sie müssen die Größe vor dem Sortieren normalisieren. Der einfachste Weg wäre, eine Programmiersprache wie Perl oder Python zu verwenden, aber Sie haben bereits festgestellt, dass dies keine Option ist (obwohl ich es seltsam finde, dass Perl nicht bereits auf dem Rechner ist). Sie können Shell-Code verwenden, um diese Daten zu normalisieren, aber es ist ein Schmerz im Tučkus:

#!/bin/bash 

ECHO=/bin/echo 
TR=/usr/bin/tr 
BC=/usr/bin/bc 

while read dir size; do 
    bytes=`$ECHO $size | $TR -d "[A-Z]"` 
    case $size in 
     *B) bytes=$bytes          ;; 
     *K) bytes=`$ECHO "$bytes * 1024" | $BC`    ;; 
     *M) bytes=`$ECHO "$bytes * 1024 * 1024" | $BC`  ;; 
     *G) bytes=`$ECHO "$bytes * 1024 * 1024 * 1024" | $BC` ;; 
     *) $ECHO unknown size type       ;; 
    esac 
    echo $bytes $dir $size 
done < $1 

Dieser Shell-Skript einen Dateinamen als Argument akzeptiert und druckt die eine normierte Größe, die Verzeichnisnamen und die Größe . Dies erleichtert das Sortieren. Um wieder die ursprünglichen Felder zu erhalten, können Sie nur das erste Feld abgeschnitten:

./mk_sortable.sh file_to_sort | sort -nr | cut -f2- -d" " 

Für Aufmerksamkeit diejenigen bezahlen, ja, ich habe gerade schreiben eine Schwartzian Transform in der Schale.

0

Im Grunde müssen Sie die Zahlen entmenschlichen, nach den entmenschlichten Zahlen sortieren und dann die entmenschlichten Zahlen aus dem Ausgang entfernen. Während Sie es wahrscheinlich in einer Zeile tun können (besonders wenn Sie ein Skript schreiben, um es für Sie zu tun), denke ich, dass es mehrere Zeilen benötigen wird, um verständlich zu sein.

Wie von Drakosha bemerkt, deckt How Can I Sort 'du -h' output by size die Probleme ziemlich gut ab.

Verwandte Themen