Como exibir TSV (csv) no console, quando células vazias são perdidas por: `column -t -s $ '\ t' '

12

Eu tenho arquivo com colunas spearated com tab.

Eu tenho arquivo quando algumas linhas têm células vazias (no início, no meio).

Nesses casos, column -t -s $'\t'simplesmente falha:

Entrada:

$ 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

saída da coluna:

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

ao invés de:

A       B       C       D
        b1              d1
                        d2
a3                      d3

Você poderia recomendar como formatar a linha de comando TSV? (da maneira Unix, eu quero canalizar a saída do programa para o formatador, como column)

Alguma maneira de "consertar" a columnabordagem? Talvez outra ferramenta?

Grzegorz Wierzowiecki
fonte

Respostas:

12

Você pode apenas usar o Debian column. Ele fornece a opção -nque faz funcionar exatamente como você deseja.

Como alternativa, você pode colocar um espaço nas colunas vazias, usando sed:

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

exemplo:

$ 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
fonte
Receio como sed se comportará com a alternativa '^ \ | \ t' ... devido a '^' não especificar átomos. (Então, é ele que vai substituir \1com string vazia?
Grzegorz Wierzowiecki
Sim, \(^\)sozinho corresponde a uma sequência vazia, ancorada ao início da linha. \1"produz uma cópia" dessa string vazia.
angus
0
sed 's/||/| |/g;s/||/| |/g' filename-here

O comando acima é para pipe, então substitua-o por tabspace.

Você só precisa substituir colunas vazias por um espaço em branco e canalizar a saída para o comando que você já está usando.

Rohit
fonte