Wie sortiere ich eine durch Tabulatoren getrennte Datei?

768
coverflower

Ich versuche, sort zu verwenden, um eine durch Tabulatoren getrennte Datei wie diese zu sortieren:

Fruit Color Origin Category pear green Oviedo–Gijón–Avilés Oviedo–Gijón–Avilés strawberry red Reggio Calabria garden strawberry apple green Oviedo–Gijón–Avilés Arkansas Black banana yellow Makindye Ssabagabo East African Highland bananas 

von jeder Spalte. Dies ist, was ich mit ( <n>: Spaltennummer) endete :

$ sort -t $'\t' -k <n> <(tail -n+2 fruits.tsv) 

was für die ersten 2 Spalten, aber nicht für die 3. und 4. Spalte funktioniert. Zum Beispiel für die 4. Kolumne bekomme ich folgendes:

banana yellow Makindye Ssabagabo East African Highland bananas apple green Oviedo–Gijón–Avilés Arkansas Black pear green Oviedo–Gijón–Avilés Oviedo–Gijón–Avilés strawberry red Reggio Calabria garden strawberry 

was falsch ist. Außerdem erscheint die 4. Zeile im Terminal verschoben. Was mache ich falsch?

0
Haben Sie mehr als einen Tabulator, der die Spalten voneinander trennt? glenn jackman vor 6 Jahren 1
Was ist dein Gebietsschema? tripleee vor 6 Jahren 0
@glenn jackmann: Ja coverflower vor 6 Jahren 0
@ Tripel: LANG = "de_US.UTF-8" coverflower vor 6 Jahren 0

2 Antworten auf die Frage

3
Kamil Maciorowski

Dies sind Ihre Daten mit jeder Registerkarte, die in Folgendes umgewandelt wird |:

pear||green|Oviedo–Gijón–Avilés|Oviedo–Gijón–Avilés strawberry|red||Reggio Calabria||garden strawberry apple||green|Oviedo–Gijón–Avilés|Arkansas Black banana||yellow|Makindye Ssabagabo|East African Highland bananas 

Wie Sie sehen, gibt es Orte, an denen zwei Registerkarten voneinander getrennt sind. sorterscheint dort eine Spalte mit einem leeren Eintrag.

Lösung: Ersetzen Sie vor dem Sortieren mehrere Registerkarten durch eine einzige Registerkarte.

tail -n+2 fruits.tsv | tr -s '\t' | sort -t $'\t' -k <n> 

( Quelle ).

Wenn Sie möchten, dass die Ausgabe schön aussieht, geben Sie das Ergebnis durch column:

… | column -t -s $'\t' 

(Dies $'\t'wird durch Tabulatorzeichen in ersetzt bash). Dadurch werden jedoch Leerzeichen anstelle von Tabulatoren eingefügt, sodass das endgültige Ergebnis nur schwer weiter analysiert werden kann. Verwenden Sie columnnur dann, wenn auf den Menschen zu präsentieren.

Einige Pager (wie beispielsweise less) können Ihre durch Tabulatoren getrennten Daten auf eine schönere Weise darstellen:

… | less -x 25 
Ich habe es schon mit einem Tab probiert und dachte, es funktionierte auch nicht, aber ich lag falsch ... Auch die Ausgabe sieht gut aus, aber die Datei ist immer noch nicht leicht lesbar. Gibt es eine Möglichkeit, mehrere Registerkarten zu haben, und die Sortierung funktioniert immer noch? coverflower vor 6 Jahren 0
@coverflower Ich würde die * Daten * desinfizieren, um einzelne Registerkarten zu haben und diese in diesem Formular zu speichern. dann könnte ich auf irgendeine Weise sortieren, die ich brauche. Jedes Mal, wenn ich Lesbarkeit brauche, würde ich "column" für das * Ergebnis * verwenden. Kamil Maciorowski vor 6 Jahren 0
@coverflower Ich habe eine Bemerkung zu "weniger" hinzugefügt. Kamil Maciorowski vor 6 Jahren 0
Mit weniger sieht es noch besser aus ... coverflower vor 6 Jahren 0
0
coverflower

Mit einem zusätzlichen Schritt (Quelle: [ https://stackoverflow.com/questions/18437884/replacing-tabs-with-single-tab-in-sed([1] ):

tr -s '\t' '\t' < fruits.tsv > fruits_single_tab.tsv  tail -n+2 fruits_single_tab.tsv | tr -s '\t' | sort -t $'\t' -k 4 | less -x 25 

Ich kann mehrere Registerkarten in der Datei haben.