Используя некоторые древние утилиты Unix,
#!/bin/sh
{
printf '%s\n' ''.TS 'allbox;LLLL,LLLR.'
awk -v sq="'" '
BEGIN { FS = OFS = "\t"; fmt = "%" sq "d" }
NR==1 { print }
NR>1 {
print $1, "T{"
print $2
print "T}", "T{"
print $3
print "T}", sprintf(fmt, $4)
}
' "$@"
printf '%s\n'.TE '.pl 0'
} | tbl | nroff 2> /dev/null
Пояснение:
nroff
— древний текстовый процессор Unix. Это займет, например, Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
в качестве входных данных и производить Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
как вывод. tbl
— это передний -конец nroff
для поддержки — как вы уже догадались — генерация таблиц. .TS
— «начало стола». allbox
довольно очевидно :нарисуйте рамку вокруг каждой ячейки. LLLL
означает, что все ячейки в первой строке выровнены по левому краю -; LLLR
означает, что четвертая ячейка выровнена по правому краю -для всех последующих рядов. Я думаю, это то, что вы хотите, глядя на ваш образец вывода. -v sq="'"
создает переменную с именем sq
значением которого является одинарная кавычка. Это один из способов использования одинарной кавычки в awk-программе. и предлагается в Руководстве пользователя GNU Awk . FS
на табуляцию, так как входной сигнал — TSV. Установите OFS
на вкладку, потому что это то, что tbl
ожидает (по умолчанию ). fmt = "%" sq "d"
устанавливает fmt
на %'d
, который можно использовать с [s]printf
чтобы вывести целое число с разделителями тысяч. (Я предполагаю, что вы этого хотите, раз вы это показали.)T{
и T}
, чтобы сделать $2
и $3
с учетом переноса текста. (Я предполагаю, что вы хотите это только для второго и третьего столбцов, так как первый и четвертый столбцы содержат только короткие строки. )Выведите значение $4
с запятыми (и ), вставленными через каждые три цифры. .TE
— «конец таблицы». .pl
— длина страницы. Это что-то вроде клуджа. По умолчанию nroff
дополняет вывод пустыми строками. чтобы общий вывод был кратен 66 стркам. Установив длину страницы на ноль, мы подавляем это.printf
, awk
и printf
)передается в tbl
и nroff
. Инструкции:
gman
. $ chmod +x gman
сделать его исполняемым. shap
), сделайте $./gman shap
Возможно, вы захотите перенаправить вывод в файл :. $./gman shap > grid_table
- If you get all your data in the first column, that means that your input file doesn’t really have tabs in it (just spaces). Edit it to replace the whitespace (spaces) with tabs.
$ db_query > tmp
$./gman tmp
(и потом опционально rm tmp
, если больше ни для чего не нужно ), или просто $ db_query |./gman
gman
в каталог, указанный в пути поиска, вы сможете запустить его, просто набравgman
(без./
). Существует множество документации по этому вопросу; это легко найти, если вы ищете. Например, для ввода, показанного в вопросе, я получаю
┌───────────┬─────────────────────────────────┬───────────────┬───────┐
│ TrackId │ peerId │ Cause │ Count │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM │ pra4.pra.pnc100.tpp240.6pppset‐ │ 40009 Re‐ │ 1,401 │
│ │ work.prg │ sponse is not │ │
│ │ │ received from │ │
│ │ │ server │ │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM │ pra5.pra.pnc100.tpp240.6pppset‐ │ 40009 Re‐ │ 1,398 │
│ │ work.prg │ sponse is not │ │
│ │ │ received from │ │
│ │ │ server │ │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM │ pra3.pra.pnc100.tpp240.6pppset‐ │ 40009 Re‐ │ 1,347 │
│ │ work.prg │ sponse is not │ │
│ │ │ received from │ │
│ │ │ server │ │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM │ pra1.pra.pnc100.tpp240.6pppset‐ │ 40009 Re‐ │ 1,412 │
│ │ work.prg │ sponse is not │ │
│ │ │ received from │ │
│ │ │ server │ │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM │ pra2.pra.pnc100.tpp240.6pppset‐ │ 40009 Re‐ │ 1,355 │
│ │ work.prg │ sponse is not │ │
│ │ │ received from │ │
│ │ │ server │ │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM │ pra6.pra.pnc100.tpp240.6pppset‐ │ 40009 Re‐ │ 1,416 │
│ │ work.prg │ sponse is not │ │
│ │ │ received from │ │
│ │ │ server │ │
└───────────┴─────────────────────────────────┴───────────────┴───────┘
в качестве вывода. Есть приемы, позволяющие сделать столбцы (, например, третий )шире; дайте мне знать, что вы хотите знать.
Предупреждение :Когда вы запустите это, tbl
и nroff
будет
Если у вас есть партияданных, вы можете переполнить пределы временного хранилища, и команда не будет выполнена. Возможно, вы сможете получить полезные результаты путем разбивки ввода на более мелкие файлы.
Предупреждение :, если ваш файл содержит T{
или T}
, или значения, начинающиеся с точки(.
)или одинарной кавычки ('
), вы можете получить странные результаты.
awk '{$1=$1"|";$2=$2"|";$NF="|"$NF}1' input.txt | awk -F\| 'BEGIN{print "<table border=1>"}{gsub("\\|","</td><td>");print"<tr><td>"$0"</td></tr>"}END{print "</table>"}' > output.html
Первый awk используется для разделения значений |
второй awk используется для форматирования значений в таблицу HTML