Ich habe Daten mit folgendem Format:
foo<tab>1.00<space>1.33<space>2.00<tab>3
Jetzt habe ich versucht, die Datei nach dem letzten Feld abnehmend zu sortieren. Ich habe die folgenden Befehle ausprobiert, aber sie wurden 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 .
linux
unix
sorting
tab-delimited
neversaint
quelle
quelle
'"'"'
Sie diese Option , um sie in einem Alias zu verwenden.awk '{print $0 | "sort -nr" > "outfile" }' datafile
, außer mit einem Escape-Tabulator, der an den Sortierbefehl gesendet wird.Standardmäßig ist der Feldtrenner kein Übergang von Leer zu Leer, sodass die Registerkarte einwandfrei funktionieren sollte.
Die Spalten sind jedoch mit Basis 1 und Basis 0 indiziert, sodass Sie dies wahrscheinlich möchten
um file.txt nach Spalte 4 in umgekehrter Reihenfolge numerisch zu sortieren. (Obwohl die Daten in der Frage sogar 5 Felder haben, wäre das letzte Feld Index 5.)
quelle
Sie müssen ein tatsächliches Tabulatorzeichen nach -t \ setzen und dazu in einer Shell Strg-V und dann das Tabulatorzeichen drücken. Die meisten Shells, die ich verwendet habe, unterstützen diesen Modus der Eingabe von wörtlichen Registerkarten.
Beachten Sie jedoch, dass beim Kopieren und Einfügen von einem anderen Ort im Allgemeinen keine Tabulatoren erhalten bleiben.
quelle
C-q <tab>
zum Beispiel. Ich denke, es ist auch^V
in Nano.Die $ -Lösung hat bei mir nicht funktioniert. Indem Sie jedoch das Tabulatorzeichen selbst in den Befehl einfügen, haben Sie Folgendes ausgeführt: -t '' -k2 sortieren
quelle
<C-v><Tab>
Option, um eine Registerkarte einzufügen, falls die Tabulatortaste für die automatische Vervollständigung in Ihrer Shell verwendet wird.$'\t'
funktionieren in ksh, zsh und bash. Bourne Shell unterstützt es nicht. Siehe diesen Beitrag: unix.stackexchange.com/a/371873/201820Pfeife es durch so etwas wie
awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'
. Dadurch werden die Leerzeichen in Tabulatoren geändert.quelle
Im Allgemeinen ist es nicht besonders gut, solche Daten zu behalten, wenn Sie dies vermeiden können, da die Benutzer Tabulatoren und Leerzeichen immer verwirren.
Das Lösen Ihres Problems ist in einer Skriptsprache wie Perl, Python oder Ruby sehr einfach. Hier ist ein Beispielcode:
quelle
Ich wollte eine Lösung für die Gnu-Sortierung unter Windows, aber keine der oben genannten Lösungen funktionierte für mich in der Befehlszeile.
Mit Lloyd's Hinweis funktionierte die folgende Batch-Datei (.bat) für mich.
Geben Sie das Tabulatorzeichen in doppelte Anführungszeichen ein.
quelle
Ich hatte dieses Problem mit der Sortierung in Cygwin in einer Bash-Shell, wenn ich 'general-numeric-sort' verwendete. Wenn ich angegeben habe
-t$'\t' -kFg
, wobei F die Feldnummer ist, hat es nicht funktioniert, aber als ich beide angegeben habe-t$'\t'
und-kF,Fg
(z. B.-k7,7g
für das 7. Feld) hat es funktioniert.-kF,Fg
ohne das-t$'\t'
hat nicht funktioniert.quelle
Wenn Sie es sich einfacher machen möchten, indem Sie nur Tabulatoren haben, ersetzen Sie die Leerzeichen durch Tabulatoren:
quelle
usage: tr [-Ccsu] string1 string2
tr string1 string2 <some-file
. Alles kann eine Datei lesen, solange es stdin lesen kann.Die Antwort von Lars Haugseth funktionierte für mich nur über die Befehlszeile, wo sie diesen Fehler ausgibt, wenn sie über ein Shell-Skript ausgeführt wird:
sort: Registerkarte mit mehreren Zeichen '$ \ t'
Die Lösung, wenn es in einem Shell-Skript codiert ist, wenn jemand hinschaut
Das Tabulatorzeichen befindet sich zwischen dem Anführungszeichen.
quelle