Wie kann ich Spalten verwenden, um Tabulatoren und keine Leerzeichen abzugrenzen?


58

Ich möchte den Unix- columnBefehl zum Formatieren von Text verwenden. Ich habe Felder, die durch Tabulatoren getrennt sind, aber in jedem Feld gibt es auch Leerzeichen. columnBegrenzungen für Leerzeichen (Tabulatoren und Leerzeichen). Wie kann ich festlegen, dass Spalten nur Tabulatoren als Trennzeichen verwenden?

Ich habe versucht, tab als Trennzeichen anzugeben, indem ich Folgendes verwendet habe:

cat myfile | column -t -s"\t"

Antworten:


81
column -t -s '\t'

würde Spalten auf \und tZeichen trennen .

column -s \tist dasselbe wie column -s t, da der Backslash von der Shell als Anführungszeichenoperator interpretiert wird.

Hier möchten Sie der Spalte ein echtes TAB-Zeichen übergeben. Mit ksh93, zsh, bash, mksh, busybox sh oder FreeBSD sh:

column -ts $'\t'

Oder geben Sie ein echtes Tabulatorzeichen ein, indem Sie Ctrl-V Taban der Shell-Eingabeaufforderung (in Anführungszeichen oder mit einem Backslash, da das Tabulatorzeichen in der Shell-Syntax genau wie das Leerzeichen ein Tokentrennzeichen ist) oder verwenden Sie "$(printf '\t')"(diese doppelten Anführungszeichen, die zum Deaktivieren von split + glob erforderlich sind) eingeben Operator als das Tabulatorzeichen ist zufällig auch der Standardwert von $IFS).


3
Ich musste tun, column -t -s $'\t'als Bash '\t'meinte ich beides \ und t, meinte aber $'\t'eine wörtliche Registerkarte. Bash stinkt
ThorSummoner

Wenn Sie POSIX-Konformität benötigen (Herr hilf mir), lesen Sie bitte meine Antwort, die stark auf dieser fantastischen Antwort basiert!
Nick Bull

Diese Lösung hat bei mir funktioniert - der $'\t'Tabulator wird zum Begrenzer. Aber ich bin mir ziemlich sicher, dass ich awk -F "\t"einen Tabulator als Begrenzer für awk verwende. Warum funktioniert das und nicht hier für Kolumnen?
Mike

3

Ich habe folgendes verwendet (funktioniert nur, wenn Ihr Text nichts enthält |):

cat myfile | tr '\t' '|' | column -t -s '|'

Dies ersetzt nur Tabulatoren durch Pipes und verwendet dann Spalten mit Pipes als Begrenzer.

(Ich habe das getan, weil ich in Stéphanes Antwort nichts gesehen habe, was in der Fischschale sofort funktioniert hätte. Ansonsten scheint Stéphanes Antwort gut zu sein.)


3

Für POSIX, $'...'das als ANSI-C-Escape bezeichnet wird, ist es nicht definiert.

Stattdessen können Sie Folgendes verwenden $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')kann verwendet werden, da 011(oktale Darstellung von Dezimal 9) der ANSI-Code für ein horizontales Tabulatorzeichen ist:

column -t -s "$(printf '\011')"

Lesen Sie jedoch den Kommentar von Stéphane Chazelas, warum dies in allen Shell-Versionen möglicherweise nicht konsistent ist.


2
Beachten Sie, dass POSIX nicht angibt, wie die Codierung von TAB lautet. Es gibt immer noch POSIX-Systeme, deren C-Locale-Codierung auf EBCDIC basiert, wobei TAB 5 und nicht 9 wie in ASCII ist. Wo immer möglich, ist es besser, sich auf die Namen der Zeichen zu beziehen, um solche Probleme wie "$(printf '\t')"in meiner Antwort zu vermeiden . Beachten Sie, dass $'...'die Aufnahme in die nächste Hauptversion der POSIX-Spezifikation geplant ist.
Stéphane Chazelas

@ StéphaneChazelas ist $(printf '\t')POSIX? Danke!
Nick Bull


@ StéphaneChazelas Vielen Dank, ich habe meine Antwort mit Ihrem sehr hilfreichen Tipp aktualisiert :)
Nick Bull

2

Mit können -tSie die Anzahl der gewünschten Spalten auswählen. Wenn Sie dieses Feld leer lassen, ändert sich nichts. Außerdem möchten Sie nach dem Leerzeichen -sFolgendes ausprobieren:

cat myfile | column -s \t


Vielen Dank. Dies ist in der Nähe von dem, wonach ich suche. Jetzt werden jedoch alle Zeilen zu einer Zeile zusammengeführt. Wie kann ich jede Leitung auf einer eigenen Leitung halten?
Turtle

Standardmäßig werden columnZeilen vor Spalten gefüllt. Sie könnten interessiert sein anpr
Lurker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.