it-swarm.com.de

Eine tabulatorgetrennte Datei sortieren

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 .

154
neversaint

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.

277
Lars Haugseth

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.)

10
laalto

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.

4
Brian Carlsen

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

2
Lloyd

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.

1

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";
1
James Thompson

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
1

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.

0
Danny

Wenn Sie es einfacher machen möchten, indem Sie nur Tabulatoren verwenden, ersetzen Sie die Leerzeichen durch Tabulatoren:

tr " " "\t" < <file> | sort <options>
0
The Unfun Cat