Cara menampilkan TSV (csv) di konsol, ketika sel kosong dilewatkan oleh: `kolom -t -s $ '\ t'`

12

Saya punya file dengan kolom tombak tab.

Saya memiliki file ketika beberapa baris memiliki sel kosong (saat mulai, di tengah).

Dalam kasus seperti itu column -t -s $'\t'hanya gagal:

Memasukkan:

$ 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

output kolom:

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

dari pada:

A       B       C       D
        b1              d1
                        d2
a3                      d3

Bisakah Anda merekomendasikan cara melakukan pemformatan baris perintah TSV? (dengan cara Unix, saya ingin menyalurkan output program ke formatter, seperti column)

Adakah cara columnpendekatan "memperbaiki" ? Mungkin alat lain?

Grzegorz Wierzowiecki
sumber

Jawaban:

12

Anda bisa menggunakan Debian column. Ini memberikan opsi -nyang membuatnya bekerja persis seperti yang Anda inginkan.

Sebagai alternatif, Anda dapat menempatkan spasi di kolom kosong, menggunakan sed:

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

contoh:

$ 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
sumber
Saya takut bagaimana sed akan berperilaku dengan alternatif '^ \ | \ t' ... karena '^' tidak menentukan atom. (Jadi, apakah akan diganti \1dengan string kosong?
Grzegorz Wierzowiecki
Ya, \(^\)sendirian cocok dengan string kosong, berlabuh ke awal baris. \1"Menghasilkan salinan" dari string kosong itu.
angus
0
sed 's/||/| |/g;s/||/| |/g' filename-here

Perintah di atas adalah untuk pipa jadi ganti dengan tabspace.

Anda hanya perlu mengganti kolom kosong dengan ruang kosong dan menyalurkan output ke perintah yang sudah Anda gunakan.

Rohit
sumber