Обновление : здесь гораздо более простой скрипт (тот, что в конце вопроса) для табличного вывода. Просто передайте ему имя файла, как вы бы paste
... Он использует html
для создания фрейма, так что он настраивается. Он сохраняет несколько пробелов, и выравнивание столбцов сохраняется, когда встречаются символы Юникода. Однако то, как редактор или зритель отображает юникод, это совсем другое дело ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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'
---
Краткий обзор инструментов, представленных в ответах (пока).
Я довольно внимательно посмотрел на них; вот что я нашел:
paste
# Этот инструмент является общим для всех представленных ответов # Он может обрабатывать несколько файлов; поэтому несколько столбцов ... Хорошо! # Разграничивает каждый столбец с помощью табуляции ... Хорошо. # Его вывод не сведен в таблицу.
Все инструменты ниже всех удаляют этот разделитель! ... Плохо, если вам нужен разделитель.
column
# Он удаляет разделитель табуляции, поэтому поле идентифицируется исключительно по столбцам, которые, кажется, обрабатываются довольно хорошо ... Я не заметил ничего неправильного ... # Помимо отсутствия уникального разделителя, он работает отлично!
expand
# Имеет только одну настройку вкладки, поэтому она непредсказуема за пределами 2 столбцов # Выравнивание столбцов не является точным при обработке юникода, и оно удаляет разделитель табуляции, поэтому идентификация полей производится исключительно выравниванием столбцов
pr
# Имеет только одну настройку вкладки, поэтому она непредсказуема за пределами 2 столбцов. # Выравнивание столбцов не является точным при обработке юникода, и оно удаляет разделитель табуляции, поэтому поле идентифицируется исключительно по выравниванию столбца
Для меня column
это очевидный лучший солютон в качестве однострочного. Если вы хотите использовать разделитель или ASCII-арт табуляцию ваших файлов, читайте дальше, иначе ... columns
чертовски хорошо :) ) ...
Вот скрипт, который принимает любой номер файла и создает табличную презентацию в стиле ASCII. (Имейте в виду, что юникод может не отображаться до ожидаемой ширины, например, ௵, который представляет собой один символ. Это сильно отличается от столбца неверные числа, как в некоторых из утилит, упомянутых выше.) ... Вывод скрипта, показанный ниже, получен из 4 входных файлов с именем 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
Вот мой оригинальный ответ (немного урезанный вместо вышеприведенного сценария)
Используется wc
для получения ширины столбца и sed
для правой панели с видимым символом .
(только для этого примера) ... и затем paste
для объединения двух столбцов с символом табуляции ...
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
Если вы хотите выделить правую колонку:
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...........