Aggiornamento : qui c'è uno script molto più semplice (quello alla fine della domanda) per l'output tabulato. Basta passargli il nome del file come si farebbe paste
... Usa html
per creare il frame, quindi è modificabile. Conserva più spazi e l'allineamento della colonna viene preservato quando incontra caratteri unicode. Tuttavia, il modo in cui l'editor o il visualizzatore esegue il rendering dell'unicode è un'altra questione del tutto ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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 sinossi degli strumenti presentati nelle risposte (finora).
Li ho guardati da vicino; ecco cosa ho trovato:
paste
# Questo strumento è comune a tutte le risposte finora presentate # Può gestire più file; quindi più colonne ... Bene! # Delimita ogni colonna con una scheda ... Buono. # Il suo output non è tabulato.
Tutti gli strumenti sottostanti rimuovono questo delimitatore! ... Male se hai bisogno di un delimitatore.
column
# Rimuove il delimitatore Tab, quindi l'identificazione del campo è puramente per colonne che sembra gestire abbastanza bene .. Non ho notato nulla di strano ... # Oltre a non avere un delimitatore univoco, funziona benissimo!
expand
# Ha solo una singola impostazione della scheda, quindi è imprevedibile oltre 2 colonne # L'allineamento delle colonne non è preciso durante la gestione dell'unicode e rimuove il delimitatore Tab, quindi l'identificazione del campo è puramente allineata
pr
# Ha solo una singola scheda, quindi è imprevedibile oltre 2 colonne. # L'allineamento delle colonne non è preciso durante la gestione dell'unicode e rimuove il delimitatore Tab, quindi l'identificazione del campo è puramente mediante l'allineamento delle colonne
Per me, column
è il miglior soluto ovvio come one-liner .. Se vuoi il delimitatore, o una tabluation di arte ASCII dei tuoi file, continua a leggere, altrimenti .. columns
è dannatamente buono :) ...
Ecco uno script che prende qualsiasi numero di file e crea una presentazione tabulata in stile ASCII .. (Ricorda che unicode potrebbe non renderizzare alla larghezza prevista, ad es. ௵ che è un singolo carattere. Questo è abbastanza diverso dalla colonna i numeri sono errati, come nel caso di alcune delle utilità menzionate sopra.) ... L'output dello script, mostrato di seguito, proviene da 4 file di input, denominati 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
Ecco la mia risposta originale (ritagliata un po 'al posto della sceneggiatura sopra)
Utilizzo wc
per ottenere la larghezza della colonna e sed
per il pad destro con un carattere visibile.
(solo per questo esempio) ... e quindi paste
per unire le due colonne con un carattere 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
Se vuoi riempire la colonna di destra:
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...........