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
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.
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
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
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
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