Jak wyświetlić TSV (csv) w konsoli, gdy puste komórki są pomijane przez: `column -t -s $ '\ t' '

12

Mam plik z kolumnami spearated tab.

Mam plik, gdy niektóre wiersze mają puste komórki (na początku, w środku).

W takich przypadkach column -t -s $'\t'po prostu zawodzi:

Wejście:

$ 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

wyjście kolumny:

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

zamiast:

A       B       C       D
        b1              d1
                        d2
a3                      d3

Czy mógłbyś polecić, jak wykonać formatowanie wiersza poleceń TSV? (w uniksowy sposób chcę przekazać dane wyjściowe programu do formatera, jak column)

Jakikolwiek sposób na „naprawienie” column? Może inne narzędzie?

Grzegorz Wierzowiecki
źródło

Odpowiedzi:

12

Możesz po prostu użyć Debiana column. Zapewnia opcję, -nktóra sprawia, że ​​działa dokładnie tak, jak chcesz.

Alternatywnie możesz umieścić spację w pustych kolumnach, używając sed:

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

przykład:

$ 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
źródło
Obawiam się, jak sed zachowa się z alternatywnym „^ \ | \ t” ... ponieważ „^” nie określa atomów. (A więc, czy zastąpi \1go pusty ciąg?
Grzegorz Wierzowiecki,
Tak, \(^\)sam dopasowuje pusty ciąg, zakotwiczony na początku wiersza. \1„tworzy kopię” tego pustego ciągu.
angus
0
sed 's/||/| |/g;s/||/| |/g' filename-here

Powyższe polecenie dotyczy potoku, więc zamień je na tabspace.

Wystarczy zastąpić puste kolumny pustą spacją i przesłać dane wyjściowe do polecenia, którego już używasz.

Rohit
źródło