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
Elazar Leibovich
la source
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.

Barun
la source
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
Mikel
la source
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.)

Gilles, arrête de faire le mal
la source
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
Sridhar Sarnobat
la source
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

Rohit
la source
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
Aborruso
la source