Как отобразить TSV (csv) в консоли, если пустые ячейки пропущены с помощью: `column -t -s $ '\ t'`

12

У меня есть файл с колонками, с которыми связано tab.

У меня есть файл, когда в некоторых строках есть пустые ячейки (в начале, посередине).

В таких случаях column -t -s $'\t'просто выходит из строя:

Входные данные:

$ 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

вывод столбца:

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

вместо того:

A       B       C       D
        b1              d1
                        d2
a3                      d3

Не могли бы вы порекомендовать, как сделать форматирование командной строки TSV? (в Unix, я хочу направить вывод программы в форматтер, например column)

Есть ли способ «фиксации» columnподхода? Может быть, другой инструмент?

Гжегож Вежовецкий
источник

Ответы:

12

Вы можете просто использовать Debian column. Он предоставляет опцию, -nкоторая заставляет его работать именно так, как вы хотите.

Кроме того, вы можете поместить пробел в пустые столбцы, используя sed:

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

пример:

$ sed ':x s/\(^\|\t\)\t/\1 \t/; t x' < in.tsv | column -t -s $'\t'
A   B   C  D
    b1     d1
           d2
a3         d3
Ангус
источник
Боюсь, что sed будет вести себя с альтернативой '^ \ | \ t' ... из-за '^' не указываются атомы. (Таким образом, он собирается заменить \1пустой строкой?
Grzegorz Wierzowiecki
Да, \(^\)один соответствует пустой строке, привязанной к началу строки. \1«производит копию» этой пустой строки.
ангус
0
sed 's/||/| |/g;s/||/| |/g' filename-here

Приведенная выше команда относится к трубе, поэтому замените ее на tabspace.

Вам просто нужно заменить пустые столбцы пробелом и передать вывод команде, которую вы уже используете.

Рохит
источник