So zeigen Sie TSV (csv) in der Konsole an, wenn leere Zellen fehlen: `column -t -s $ '\ t'`

12

Ich habe eine Datei mit Spalten, mit denen gespeert wurde tab.

Ich habe eine Datei, wenn einige Zeilen leere Zellen haben (am Anfang, in der Mitte).

In solchen Fällen column -t -s $'\t'scheitert einfach:

Eingang:

$ echo -e 'A\tB\tC\tD\n\tb1\t\td1\n\t\t\td2\na3\t\t\td3' > in.tsv
$ hexdump -C in.tsv 
00000000  41 09 42 09 43 09 44 0a  09 62 31 09 09 64 31 0a  |A.B.C.D..b1..d1.|
00000010  09 09 09 64 32 0a 61 33  09 09 09 64 33 0a        |...d2.a3...d3.|
0000001e

Spaltenausgabe:

$ cat in.tsv | column -t -s $'\t'
A   B   C  D
b1  d1
d2
a3  d3

Anstatt von:

A       B       C       D
        b1              d1
                        d2
a3                      d3

Könnten Sie empfehlen, wie die TSV-Befehlszeilenformatierung durchgeführt wird? (Auf Unix-Art möchte ich die Ausgabe eines Programms in einen Formatierer leiten, wie column)

Irgendeine Art "Fixing" column-Ansatz? Vielleicht ein anderes Werkzeug?

Grzegorz Wierzowiecki
quelle

Antworten:

12

Sie können einfach Debian verwenden column. Es bietet die Option, mit -nder es genau so funktioniert, wie Sie es möchten.

Alternativ können Sie ein Leerzeichen in die leeren Spalten einfügen sed:

sed ':x s/\(^\|\t\)\t/\1 \t/; t x' < in.tsv | column -t -s $'\t'

Beispiel:

$ sed ':x s/\(^\|\t\)\t/\1 \t/; t x' < in.tsv | column -t -s $'\t'
A   B   C  D
    b1     d1
           d2
a3         d3
angus
quelle
Ich fürchte, wie sich sed mit der Alternative '^ \ | \ t' verhält ... weil '^' keine Atome spezifiziert. (Also, wird es \1durch eine leere Zeichenfolge ersetzt?
Grzegorz Wierzowiecki
Ja, \(^\)allein entspricht einer leeren Zeichenfolge, die am Zeilenanfang verankert ist. \1"erzeugt eine Kopie" dieser leeren Zeichenkette.
Angus
0
sed 's/||/| |/g;s/||/| |/g' filename-here

Der obige Befehl gilt für Pipe. Ersetzen Sie ihn also durch Tabulator.

Sie müssen nur leere Spalten durch ein Leerzeichen ersetzen und die Ausgabe an den Befehl weiterleiten, den Sie bereits verwenden.

Rohit
quelle