Comment afficher TSV (csv) dans la console, lorsque des cellules vides sont manquées par: `column -t -s $ '\ t' '

12

J'ai un fichier avec des colonnes spearated avec tab.

J'ai un fichier lorsque certaines lignes ont des cellules vides (au début, au milieu).

Dans de tels cas, column -t -s $'\t'échoue tout simplement:

Contribution:

$ 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

sortie de colonne:

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

au lieu de:

A       B       C       D
        b1              d1
                        d2
a3                      d3

Pourriez-vous recommander comment effectuer le formatage de la ligne de commande TSV? (à la manière Unix, je veux diriger la sortie du programme dans le formateur, comme column)

Une manière de "fixer" l' columnapproche? Peut-être un autre outil?

Grzegorz Wierzowiecki
la source

Réponses:

12

Vous pouvez simplement utiliser Debian column. Il fournit l'option -nqui le fait fonctionner exactement comme vous le souhaitez.

Alternativement, vous pouvez mettre un espace dans les colonnes vides, en utilisant sed:

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

exemple:

$ 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
la source
J'ai peur de la façon dont sed se comportera avec l'alternative '^ \ | \ t' ... car '^' ne spécifie pas les atomes. (Alors, cela va-t-il remplacer \1par une chaîne vide?
Grzegorz Wierzowiecki
Oui, \(^\)seul correspond à une chaîne vide, ancrée au début de la ligne. \1"produit une copie" de cette chaîne vide.
angus
0
sed 's/||/| |/g;s/||/| |/g' filename-here

La commande ci-dessus concerne le tuyau, remplacez-le par un espace de tabulation.

Il vous suffit de remplacer les colonnes vides par un espace vide et de diriger la sortie vers la commande que vous utilisez déjà.

Rohit
la source