Ich habe Daten mit folgendem Format:
foo<tab>1.00<space>1.33<space>2.00<tab>3
Jetzt habe ich versucht, die Datei absteigend nach dem letzten Feld zu sortieren ... Ich habe die folgenden Befehle ausprobiert, aber es wurde nicht wie erwartet sortiert.
$ sort -k3nr file.txt # apparently this sort by space as delimiter
$ sort -t"\t" -k3nr file.txt
sort: multi-character tab `\\t'
$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
sort: multi-character tab `\\t'
Was ist der richtige Weg, um es zu tun?
Hier sind die Beispieldaten .
Mit bash erledigen Sie den Trick:
$ sort -t$'\t' -k3 -nr file.txt
Beachten Sie das Dollarzeichen vor der einfachen Anführungszeichenfolge. Sie können aboutit in den Abschnitten ANSI-C Quoting der Manpage bash lesen.
Standardmäßig ist der Feldbegrenzer kein Übergang von Leerzeichen zu Leerzeichen, daher sollte die Registerkarte gut funktionieren.
Die Spalten sind jedoch als Basis 1 und Basis 0 indiziert, so dass Sie dies wahrscheinlich wünschen
sort -k4nr file.txt
file.txt numerisch in umgekehrter Reihenfolge sortieren. (Obwohl die Daten in der Frage sogar 5 Felder enthalten, wäre das letzte Feld Index 5.)
Sie müssen ein tatsächliches Tabulatorzeichen hinter dem -t\setzen und dazu in einer Shell drücken Sie Strg-v und dann das Tabulatorzeichen. Die meisten Shells, die ich verwendet habe, unterstützen diesen Modus des Registereintrags.
Beachten Sie jedoch, dass beim Kopieren und Einfügen von einem anderen Ort im Allgemeinen keine Registerkarten beibehalten werden.
Die $ -Lösung hat für mich nicht funktioniert. Durch das Einfügen des Tabulatorzeichens selbst in den Befehl tat dies jedoch: Sort -t '' -k2
leiten Sie es durch etwas wie awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Dadurch werden die Leerzeichen in Registerkarten geändert.
Im Allgemeinen ist es nicht besonders sinnvoll, solche Daten zu erhalten, wenn Sie dies vermeiden können, da die Benutzer immer Tabs und Leerzeichen durcheinanderbringen.
Das Lösen Ihres Problems ist in einer Skriptsprache wie Perl, Python oder Ruby sehr einfach. Hier ist ein Beispielcode:
#!/usr/bin/Perl -w
use strict;
my $sort_field = 2;
my $split_regex = qr{\s+};
my @data;
Push @data, "7 8\t 9";
Push @data, "4 5\t 6";
Push @data, "1 2\t 3";
my @sorted_data =
map { $_->[1] }
sort { $a->[0] <=> $b->[0] }
map { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
@data;
print "unsorted\n";
print join "\n", @data, "\n";
print "sorted by $sort_field, lines split by $split_regex\n";
print join "\n", @sorted_data, "\n";
Ich wollte eine Lösung für Gnu-Sortierung unter Windows, aber keine der oben genannten Lösungen funktionierte für mich in der Befehlszeile.
Mit Lloyd's Ahnung funktionierte die folgende Batchdatei (.bat) für mich.
Geben Sie das Tabulatorzeichen in die Anführungszeichen ein.
C:\>cat foo.bat
sort -k3 -t" " tabfile.txt
Ich hatte dieses Problem mit der Sortierung in Cygwin in einer Bash-Shell, wenn Sie 'General-Numeric-Sort' verwenden. Wenn ich -t$'\t' -kFg
angegeben habe, wobei F die Feldnummer ist, hat es nicht funktioniert, aber wenn ich sowohl -t$'\t'
als auch -kF,Fg
(z. B. -k7,7g
für das 7. Feld) angegeben habe, hat es funktioniert. -kF,Fg
ohne -t$'\t'
hat nicht funktioniert.
Wenn Sie es einfacher machen möchten, indem Sie nur Tabulatoren verwenden, ersetzen Sie die Leerzeichen durch Tabulatoren:
tr " " "\t" < <file> | sort <options>