Existe-t-il une simple command pour la sortie des colonnes délimitées par des tabulations?

Par exemple, j'ai un file (produit avec echo -e "var1\tvar2\t\var3\tvar4" > foo )

 $ cat foo case elems meshing nlsys uniform 2350 0.076662 2.78 non-conformal 348 0.013332 0.55 scale 318 0.013333 0.44 smarter 504 0.016666 0.64 submodel 360 .009999 0.40 unstruct-quad 640 0.019999 0.80 unstruct-sorting 1484 0.01 0.88 

Je préfère la sortie comme ceci (ici j'ai utilisé vim et :set tabstop=14 ):

 case elems meshing nlsys uniform 2350 0.076662 2.78 non-conformal 348 0.013332 0.55 scale 318 0.013333 0.44 smarter 504 0.016666 0.64 submodel 360 .009999 0.40 unstruct-quad 640 0.019999 0.80 unstruct-sorting 1484 0.01 0.88 

Je peux get la même fonctionnalité avec cat si j'utilise $ tabs=15 en bash (voir cette question ). Existe-t-il un programme qui effectue ce formatting automatiquement? Je ne veux pas tester la valeur des tabs avant de lancer un file.

    J'utilise habituellement le programme de column pour cela, c'est dans un package appelé bsdmainutils sur Debian:

     column -t foo 

    Sortie:

     case elems meshing nlsys uniform 2350 0.076662 2.78 non-conformal 348 0.013332 0.55 scale 318 0.013333 0.44 smarter 504 0.016666 0.64 submodel 360 .009999 0.40 unstruct-quad 640 0.019999 0.80 unstruct-sorting 1484 0.01 0.88 

    Extrait de la column(1) sur mon système:

     ... -t Determine the number of columns the input contains and create a table. Columns are delimited with whitespace, by default, or with the characters supplied using the -s option. Useful for pretty-printing displays. ... 

    Plusieurs options:

     var1=uniform var2=2350 var3=0.076662 var4=2.78 printf '%-15s %-10s %-12s %s\n' \ case elems messing nlsys \ "$var1" "$var2" "$var3" "$var4" printf '%s\t%s\t%s\t%s\n' \ case elems messing nlsys \ "$var1" "$var2" "$var3" "$var4" | expand -t 15,25,37 printf '%s\t%s\t%s\t%s\n' \ case elems messing nlsys \ "$var1" "$var2" "$var3" "$var4" | column -t -s $'\t' 

    La colonne est une command non standard, certaines implémentations / versions ne prennent pas en charge l'option -s. Il calcule la largeur de la colonne en fonction de l'input, mais cela signifie qu'il ne peut commencer à s'afficher qu'une fois que toute l'input a été alimentée. $'...' est la syntaxe ksh93 également trouvée dans zsh et bash.

    Avec zsh:

     values=( case elems messing nlsys "$var1" "$var2" "$var3" "$var4" ) print -arC4 -- "$values[@]" 

    Vous pouvez également utiliser rs comme alternative à la column -t :

     (x=$(cat);rs -c -z $(wc -l<<<"$x")<<<"$x") 

    -c modifie le séparateur de colonne d'input, mais -c seul définit le séparateur de colonne d'input dans un onglet. -z définit la largeur de chaque colonne sur la largeur de l'input la plus longue de la colonne au lieu de rendre toutes les colonnes de la même largeur. Si certaines lignes ont less de colonnes que la première ligne, ajoutez -n .

    La question était de sortir des colonnes délimitées par des tabulations.

    Donc la bonne réponse est une petite adaptation de la réponse de @nisetama. J'ai ajouté l'option -C $ '\ t' qui définit la mise en forme de la sortie.

     x=$(cat foo2); rs -C$'\t' $(wc -l <<<"$x") <<<"$x" 

    Kudo à @nisetama si 🙂