web-dev-qa-db-fra.com

Commande à l'onglet de la mise en page Liste séparée joliment

Parfois, je reçois une liste séparée par onglet d'entrée, qui n'est pas assez alignée, par exemple

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

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

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3
42
Elazar Leibovich

Donc, la réponse devient:

column -t file_name

Notez que cela scindre des colonnes à tout Whitespace, pas seulement des onglets. Si vous souhaitez vous diviser uniquement sur des onglets, utilisez:

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

Les -s $'\t' Définit le délimiteur aux onglets uniquement et -n conserve des colonnes vides (onglets adjacents).

P.S.: Voulez-vous simplement souligner que le crédit va à Alex aussi. L'indice d'origine a été fourni par lui comme un commentaire à la question, mais n'a jamais été posté comme une réponse.

55
Barun

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";
}

tilisation

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

Pour l'onglet manuel s'arrête: expand -t 42,48

Pour les arrêts de tabulation automatique, comme suggéré par Alex : column -t

(expand est sur tous les systèmes POSIX. column est un utilitaire BSD, disponible dans de nombreuses distributions Linux.)

Après le commentaire de Peter.o, ce que je voulais aligner (TAB Délimité Data, TSV), cette phrase fonctionne très bien:

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

Avec Miller ( http://johnkerl.org/miller/doc ) Vous avez une jolie sortie d'impression.

Courir

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

pour avoir

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
0
aborruso
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

Explication:

SED ajoutera un espace entre les délimités vierges

La colonne ajoutera un espacement égal entre les colonnes

zydsld|asl|asd
das|aosdk|dd

devient

zydsld|asl  |asd
das   |aosdk|dd 

Moins ouvrira la sortie dans un visualiseur de fichiers. -N and -s va ajouter un numéro de ligne et désactivera respectivement l'emballage

0
Rohit