Actualización : Aquí hay un script mucho más simple (el que está al final de la pregunta) para la salida tabulada. Simplemente pásale el nombre de archivo como lo harías paste
... Se usa html
para hacer el marco, por lo que es modificable. Conserva múltiples espacios, y la alineación de la columna se conserva cuando encuentra caracteres unicode. Sin embargo, la forma en que el editor o el espectador representa el Unicode es otra cuestión completamente ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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'
---
Una sinopsis de las herramientas presentadas en las respuestas (hasta ahora).
Los he mirado de cerca; Esto es lo que he encontrado:
paste
# Esta herramienta es común a todas las respuestas presentadas hasta ahora # Puede manejar múltiples archivos; por lo tanto múltiples columnas ... ¡Bien! # Delimita cada columna con una pestaña ... Bien. # Su salida no está tabulada.
¡Todas las herramientas a continuación eliminan este delimitador! ... Malo si necesita un delimitador.
column
# Elimina el delimitador de tabulación, por lo que la identificación del campo es puramente por columnas que parece manejar bastante bien ... No he visto nada extraño ... # Además de no tener un delimitador único, ¡funciona bien!
expand
# Solo tiene una configuración de pestaña única, por lo que es impredecible más allá de 2 columnas # La alineación de las columnas no es precisa cuando se maneja unicode, y elimina el delimitador de pestaña, por lo que la identificación del campo es puramente por alineación de columna
pr
# Solo tiene una configuración de pestaña única, por lo que es impredecible más allá de 2 columnas. # La alineación de las columnas no es precisa cuando se maneja unicode, y elimina el delimitador de Tabulación, por lo que la identificación del campo es puramente por la alineación de la columna.
Para mí, column
es la mejor solución obvia como una línea. Si quieres el delimitador o una tabulación de arte ASCII de tus archivos, sigue leyendo, de lo contrario ... columns
es bastante bueno:) ...
Aquí hay una secuencia de comandos que toma cualquier cantidad de archivos y crea una presentación tabulada de arte ASCII. los números están equivocados, como es el caso en algunas de las utilidades mencionadas anteriormente.) ... La salida del script, que se muestra a continuación, es de 4 archivos de entrada, llamados 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
Aquí está mi respuesta original (recortada un poco en lugar del guión anterior)
Utilizando wc
para obtener el ancho de la columna, y sed
para el pad derecho con un carácter visible.
(solo para este ejemplo) ... y luego paste
para unir las dos columnas con un carácter Tab ...
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 desea rellenar la columna derecha:
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...........