Awk для преобразования таблицы TSV в таблицу сетки

Загрузите файл deb из здесь(прямая ссылка на загрузку из Debian ), поместите его в корень второго USB (не создавайте никакой структуры ), затем вставьте и попробуй продолжить.

-1
26.08.2020, 06:58
2 ответа

Используя некоторые древние утилиты 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.
  • У меня было много проблем с появлением сообщений об ошибках, хотя стандартный вывод был разумным, поэтому я отправил stderr на битбакет. Если вы получаете странные результаты, первое, что вы должны сделать избавиться от перенаправления stderr и посмотреть сообщения об ошибках (хотя они могут быть не очень полезными ).

Инструкции:

  • Поместите приведенный выше код в файл. Например, назовите его 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будет

  1. прочитать все данные,
  2. сохранить его в памяти и/или во временном файле,
  3. вычислить ширину столбцов, а затем
  4. вывести все данные.

Если у вас есть партияданных, вы можете переполнить пределы временного хранилища, и команда не будет выполнена. Возможно, вы сможете получить полезные результаты путем разбивки ввода на более мелкие файлы.

Предупреждение :, если ваш файл содержит T{или T}, или значения, начинающиеся с точки(.)или одинарной кавычки ('), вы можете получить странные результаты.

4
18.03.2021, 23:12
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

0
18.03.2021, 23:12

Теги

Похожие вопросы