Mise à jour : Voici un script beaucoup plus simple (celui à la fin de la question) pour la sortie sous forme de tableau. Il suffit de lui transmettre le nom du fichier comme vous le feriez pour paste
... Il utilise html
pour créer le cadre, il est donc ajustable. Il conserve plusieurs espaces et l'alignement des colonnes est préservé lorsqu'il rencontre des caractères unicode. Cependant, la manière dont l'éditeur ou le visualiseur rend l'unicode est un tout autre problème ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ Languages │ Minimal │ Chomsky │ Unrestricted │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Recursive │ Turing machine │ Finite │ space indented │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Regular │ Grammars │ │ ➀ unicode may render oddly │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ 1 2 3 4 spaces │ │ Symbol-& │ but the column count is ok │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ │ │ │ Context │
└──────────────────────┴────────────────┴──────────┴────────────────────────────┘
#!/bin/bash
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
paste "$@" |sed -re 's#(.*)#\x09\1\x09#' -e 's#\x09# </pre></td>\n<td><pre> #g' -e 's#^ </pre></td>#<tr>#' -e 's#\n<td><pre> $#\n</tr>#'
echo -e "</table>\n</html>"
} |w3m -dump -T 'text/html'
---
Un résumé des outils présentés dans les réponses (jusqu'à présent).
Je les ai regardées de près. voici ce que j'ai trouvé:
paste
# Cet outil est commun à toutes les réponses présentées jusqu'à présent. # Il peut gérer plusieurs fichiers. donc plusieurs colonnes ... Bien! # Il délimite chaque colonne avec un onglet ... Bien. # Sa sortie n'est pas tabulée.
Tous les outils ci-dessous suppriment tous ce délimiteur! ... Mauvais si vous avez besoin d'un délimiteur.
column
# Il supprime le délimiteur de tabulation, donc l'identification de champ est purement basée sur des colonnes qu'il semble gérer assez bien .. Je n'ai rien vu de mal ... # En plus de ne pas avoir de délimiteur unique, cela fonctionne bien!
expand
# N'a qu'un seul paramètre de tabulation, de sorte qu'il est imprévisible au-delà de 2 colonnes. # L'alignement des colonnes n'est pas précis lors de la gestion d'unicode et il supprime le délimiteur de tabulation. L'identification de champ est donc purement par alignement de colonne.
pr
# Ne comporte qu'un seul paramètre de tabulation, il est donc imprévisible au-delà de 2 colonnes. # L'alignement des colonnes n'est pas précis lors de la gestion de l'unicode et supprime le délimiteur de tabulation. L'identification du champ se fait donc uniquement par alignement de colonne.
Pour moi, column
c’est la meilleure solution évidente en tant que one-liner .. Si vous voulez soit le délimiteur, soit une tabluation ASCII-art de vos fichiers, lisez la suite, sinon ... columns
c’est sacrément bon:) ...
Voici un script qui prend n’importe quel nombre de fichiers et crée une présentation sous forme de tableau ASCII-art. (Notez que l’unicode peut ne pas restituer la largeur attendue, par exemple. ௵, qui est un seul caractère. Ceci est très différent de la colonne. les nombres étant incorrects, comme dans certains des utilitaires mentionnés ci-dessus.) ... La sortie du script, illustrée ci-dessous, provient de 4 fichiers d'entrée, nommés F1 F2 F3 F4 ...
+------------------------+-------------------+-------------------+--------------+
| Languages | Minimal automaton | Chomsky hierarchy | Grammars |
| Recursively enumerable | Turing machine | Type-0 | Unrestricted |
| Regular | Finite | — | |
| Alphabet | | Symbol | |
| | | | Context |
+------------------------+-------------------+-------------------+--------------+
#!/bin/bash
# Note: The next line is for testing purposes only!
set F1 F2 F3 F4 # Simulate commandline filename args $1 $2 etc...
p=' ' # The pad character
# Get line and column stats
cc=${#@}; lmax= # Count of columns (== input files)
for c in $(seq 1 $cc) ;do # Filenames from the commandline
F[$c]="${!c}"
wc=($(wc -l -L <${F[$c]})) # File length and width of longest line
l[$c]=${wc[0]} # File length (per file)
L[$c]=${wc[1]} # Longest line (per file)
((lmax<${l[$c]})) && lmax=${l[$c]} # Length of longest file
done
# Determine line-count deficits of shorter files
for c in $(seq 1 $cc) ;do
((${l[$c]}<lmax)) && D[$c]=$((lmax-${l[$c]})) || D[$c]=0
done
# Build '\n' strings to cater for short-file deficits
for c in $(seq 1 $cc) ;do
for n in $(seq 1 ${D[$c]}) ;do
N[$c]=${N[$c]}$'\n'
done
done
# Build the command to suit the number of input files
source=$(mktemp)
>"$source" echo 'paste \'
for c in $(seq 1 $cc) ;do
((${L[$c]}==0)) && e="x" || e=":a -e \"s/^.{0,$((${L[$c]}-1))}$/&$p/;ta\""
>>"$source" echo '<(sed -re '"$e"' <(cat "${F['$c']}"; echo -n "${N['$c']}")) \'
done
# include the ASCII-art Table framework
>>"$source" echo ' | sed -e "s/.*/| & |/" -e "s/\t/ | /g" \' # Add vertical frame lines
>>"$source" echo ' | sed -re "1 {h;s/[^|]/-/g;s/\|/+/g;p;g}" \' # Add top and botom frame lines
>>"$source" echo ' -e "$ {p;s/[^|]/-/g;s/\|/+/g}"'
>>"$source" echo
# Run the code
source "$source"
rm "$source"
exit
Voici ma réponse originale (coupé un peu au lieu du script ci-dessus)
Utiliser wc
pour obtenir la largeur de colonne, et sed
pour pad droit avec un caractère visible.
(juste pour cet exemple) ... et ensuite paste
pour joindre les deux colonnes avec un caractère de tabulation ...
paste <(sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1) F2
# output (No trailing whitespace)
Languages............. Minimal automaton
Recursively enumerable Turing machine
Regular............... Finite
Si vous voulez remplir la colonne de droite:
paste <( sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1 ) \
<( sed -re :a -e 's/^.{1,'"$(($(wc -L <F2)-1))"'}$/&./;ta' F2 )
# output (With trailing whitespace)
Languages............. Minimal automaton
Recursively enumerable Turing machine...
Regular............... Finite...........