2008-12-02 5 views
3

En cherchant un script de mise en forme de colonne, j'ai le sentiment que cela pourrait être une awk d'une ligne. Idéalement, un petit script shell est tout ce que je suis après.Tab données espacées aux colonnes rembourrées

Les données sont séparées par des tabulations, chaque cellule de chaque ligne est de longueur variable et, bien sûr, peut contenir des espaces.

Nous avons donc quelque chose comme ça

 
dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas 
e dward das dsaw das daswf 
fjdk ewf jken dsajkw dskdw 
hklt ewq vn1 daskcn daskw 

devrait finir par quelque chose comme ceci:

 
dasj  dhsahdwe dhasdhajks ewqhehwq dsajkdhas 
e dward das  dsaw  das  daswf  
fjdk  ewf  jken  dsajkw  dskdw  
hklt  ewq  vn1  daskcn  daskw  

Idéalement, être en mesure de régler la quantité de disque espacés entre chacun d'eux. Mieux encore, si l'on regarde colonne par colonne, les premières cellules courtes n'obtiennent pas toutes le même bourrage.

Pas idéal:

 
1  dhsahdwe dhasdhajks ewqhehwq dsajkdhas 
2  das  dsaw  das  daswf  
3  ewf  jken  dsajkw  dskdw  
4  ewq  vn1  daskcn  daskw  

Idéal:

 
1 dhsahdwe dhasdhajks ewqhehwq dsajkdhas 
2 das  dsaw  das  daswf  
3 ewf  jken  dsajkw dskdw  
4 ewq  vn1   daskcn daskw  

Répondre

1

Dans un obsfucated-Perl:

#!/usr/bin/perl -w 

use strict; 

my (@data, @length); 
while (<>) { 
    chomp; 
    my @line = split(/\t/); 
    foreach my $i (0 .. $#line) { 
     my $n = length($line[$i]); 
     $length[$i] = $n if (!defined($length[$i]) || $n > $length[$i]); 
    } 
    push(@data, [ @line ]); 
} 

$length[$#length] = 0; # no need to pad the last column 
my $fmt = join(" ", map { "%-${_}s" } @length) . "\n"; 
foreach my $ref (@data) { 
    printf $fmt, @$ref; 
} 
1

Ici vous allez. Testé avec "gawk".

BEGIN { 
    FS = "\t"; 
    # max: Column width 
    # fpl: Fields per line 
    # data: Fields in every line 
} 
{ # Note the blank before this brace 
    fpl[FNR] = NF; 
    for (i=1; i<=NF; i++) { 
     data[FNR, i] = $i; 
     if (length($i) > max[i]) { 
      max[i] = length($i); 
     } 
    } 
} 
END { 
    for (l=1; l<=length(fpl); l++) { 
     for (i=1; i<=fpl[l]; i++) { 
      fmt = "%-" max[i] "s"; 
      if (i > 1) { 
       printf " "; # This goes between columns 
      } 
      printf fmt, data[l, i]; 
     } 
     printf "\n"; 
    } 
} 
4

Si vous êtes sur un système d'exploitation dérivé de BSD (y compris Mac OS X) colonne (1) et son option -t peut faire ce que vous voulez:

% column -t coltest                
dasj dhsahdwe dhasdhajks ewqhehwq dsajkdhas 
e  dward  das   dsaw  das  daswf 
fjdk ewf  jken  dsajkw dskdw 
hklt ewq  vn1   daskcn daskw 
+1

pourrait vouloir ajouter aussi -s options pour limiter les délimiteurs de colonne. Par défaut, l'espace et l'onglet peuvent délimiter des colonnes. Je suis presque allé avec la réponse gawk jusqu'à ce que j'ai vu celui-ci. merci de fournir une solution simple! –

Questions connexes