Aktualizacja : tutaj jest o wiele prostszy skrypt (ten na końcu pytania) dla danych tabelarycznych. Po prostu przekaż do niego nazwę pliku, tak jak chcesz paste
... Służy html
do tworzenia ramki, więc można ją modyfikować. Zachowuje wiele spacji, a wyrównanie kolumny jest zachowywane, gdy napotka znaki Unicode. Jednak sposób, w jaki redaktor lub przeglądający renderuje Unicode, to zupełnie inna sprawa ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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'
---
Streszczenie narzędzi przedstawionych w odpowiedziach (jak dotąd).
Przyjrzałem się im z bliska; oto co znalazłem:
paste
# To narzędzie jest wspólne dla wszystkich dotychczas prezentowanych odpowiedzi # Może obsługiwać wiele plików; dlatego wiele kolumn ... Dobrze! # Określa każdą kolumnę tabulatorem ... Dobrze. # Dane wyjściowe nie są zestawione w tabelach.
Wszystkie poniższe narzędzia usuwają ten ogranicznik! ... Źle, jeśli potrzebujesz ogranicznika.
column
# Usuwa ogranicznik Tab, więc identyfikacja pola jest oparta wyłącznie na kolumnach, które wydają się całkiem dobrze obsługiwać .. Nie zauważyłem niczego złego ... # Poza brakiem unikalnego ogranicznika, działa dobrze!
expand
# Ma tylko ustawienie pojedynczej tabulacji, więc jest nieprzewidywalny poza 2 kolumnami # Wyrównanie kolumn nie jest dokładne przy obsłudze Unicode, i usuwa separator Tab, więc identyfikacja pola odbywa się wyłącznie na podstawie wyrównania kolumn
pr
# Ma tylko ustawienie jednej karty, więc jest nieprzewidywalny poza 2 kolumnami. # Wyrównanie kolumn nie jest dokładne podczas obsługi Unicode i usuwa separator Tab, więc identyfikacja pola odbywa się wyłącznie na podstawie wyrównania kolumn
Dla mnie column
to oczywiste najlepsze rozwiązanie jako linijka .. Chcesz separator lub tablicę ASCII-art swoich plików, czytaj dalej, w przeciwnym razie ... columns
jest całkiem dobra :) ...
Oto skrypt, który pobiera dowolną liczbę plików i tworzy tabelaryczną prezentację ASCII-art. (Pamiętaj, że Unicode może nie renderować oczekiwanej szerokości, np. ௵, która jest pojedynczym znakiem. Jest to całkiem inna kolumna liczby są niepoprawne, jak ma to miejsce w przypadku niektórych narzędzi wymienionych powyżej.) ... Wyjście skryptu, pokazane poniżej, pochodzi z 4 plików wejściowych o nazwie 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
Oto moja oryginalna odpowiedź (nieco przycięta zamiast powyższego skryptu)
Używając, wc
aby uzyskać szerokość kolumny i sed
prawy pad z widocznym znakiem .
(tylko dla tego przykładu) ... a następnie paste
połączyć dwie kolumny znakiem 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
Jeśli chcesz uzupełnić prawą kolumnę:
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...........