commande à la mise en page onglet séparé liste bien


39

Parfois, je reçois une liste séparée par des tabulations, ce qui n’est pas tout à fait aligné, par exemple

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Y at-il un moyen facile de les rendre alignés?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

Quelqu'un pourrait faire une solution basée sur des tabstops élastiques: nickgravgaard.com/elastictabstops
Mikel


Et une implémentation de Go: golang.org/pkg/tabwriter
Mikel

16
Essayé de le faire passer column -t?
alex

7
Niché à la fin de la réponse de Mikel au perl, se trouve le commentaire décisif (de Mikel) ... columns -tagit sur les espaces généraux. Pour travailler uniquement avec les onglets , utilisezcolumn -t -s $'\t'
Peter.O

Réponses:


51

Donc, la réponse devient:

column -t file_name

Notez que cela divise les colonnes à n’importe quel espace, pas seulement les onglets. Si vous voulez diviser sur des onglets seulement, utilisez:

column -t -s $'\t' -n file_name

Les -s $'\t'ensembles délimiteur à onglets uniquement et -nconserves vides des colonnes adjacentes (onglets).

PS: Je veux juste souligner que le mérite revient également à Alex . La suggestion initiale avait été fournie par lui en tant que commentaire à la question, mais n'avait jamais été postée en tant que réponse.


J'attendrai un peu qu'Alex ait le crédit, je pense qu'il le mérite. S'il ne répond pas dans quelques jours, j'accepterai une réponse de quelqu'un d'autre.
Elazar Leibovich

Sûr! Moi aussi, je n'étais pas au courant column:)
Barun le

1
Cela semble idéal mais columnsemble malheureusement échouer lorsqu'il rencontre des cellules vides. Voir ce post . En fonction de columnvotre version , vous pourrez peut-être spécifier l' -noption pour corriger cela.
John J. Camilleri

En outre, cette commande ne sera pas seulement divisée en onglets, mais également en "tout espace blanc". Pour séparer uniquement les onglets, utilisez column -t -s $'\t'.
Fritz

3

Voici un script pour le faire:

aligntabs.pl

#!/usr/bin/perl

my $delim = '\s*\t\s*';

my %length = ();
my @lines = ();
for my $line (<>) {
    chomp $line;
    my @words = split $delim, $line;
    my $numwords = scalar(@words);
    for my $i (0..$numwords-1) {
        my $maxlen = $length{$i} // 0;
        my $thislen = length($words[$i]);
        $maxlen = ($thislen > $maxlen)? $thislen: $maxlen;
        $length{$i} = $maxlen;
    }
    push @lines, [@words];
}

foreach my $wordsref (@lines) {
    my @words = @$wordsref;
    my $numwords = scalar(@words);
    for my $i (0..$numwords-1) {
        if ($i < $numwords-1) {
            my $fieldlen = $length{$i};
            printf "%-${fieldlen}s ", $words[$i];
        }
        else {
            print $words[$i];
        }
    }
    print "\n";
}

usage

$ aligntabs.pl < infile
var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3

Merci, mais j'espérais qu'il existe un moyen plus "portable" de le faire.
Elazar Leibovich

Moi aussi! Impossible d'en trouver un. pret nlsont les deux outils de base pour la mise en forme, et après cela awk, sed, perl, etc.
Mikel

1
c'est aussi simple quecolumn
Elazar Leibovich

2
@ Elzar Excellent! column -t -s $'\t'semble faire le travail.
Mikel

3

Pour les arrêts de tabulation manuels: expand -t 42,48

Pour les taquets de tabulation automatiques, comme suggéré par alex :column -t

( expandest présent sur tous les systèmes POSIX. columnest un utilitaire BSD, également disponible dans de nombreuses distributions Linux.)


1

Suite au commentaire de Peter.O sur lequel je voulais aligner (données délimitées par des tabulations, TSV), cette phrase fonctionne très bien:

column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines

0
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

Explication:

Sed ajoutera un espace entre les délimiteurs vierges

La colonne ajoutera un espacement égal entre les colonnes

zydsld|asl|asd
das|aosdk|dd

devient

zydsld|asl  |asd
das   |aosdk|dd 

Less ouvrira la sortie dans un visualiseur de fichiers. -N et -S ajouteront un numéro de ligne et désactiveront le retour à la ligne


1
Les réponses à une ligne ne sont souvent pas les plus utiles. Pensez à étendre votre publication pour y inclure une explication de votre solution ou une documentation qui la prend en charge.
HalosGhost

0

Avec Miller ( http://johnkerl.org/miller/doc ), vous avez une jolie sortie imprimée.

Courir

mlr --inidx --ifs "\t" --opprint cat input | tail -n +2

avoir

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.