Превращая данные, собранные вертикально в таблицу

Короткий ответ - «Нет» - вашим ограничивающим фактором для такого рода операций является дисковый ввод-вывод. Нет возможности передать 25 ГБ диска быстрее. Вы можете получить незначительное улучшение, если не редактируете на месте и записываете результат sed на отдельный диск (если он у вас есть) - потому что таким образом вы можете читать с одного, пока вы пишете другому, в результате возникает немного меньше разногласий.

Вы можете немного ускорить его, не используя механизм регулярных выражений для каждой строки - например, используя perl (я почти уверен, что вы можете сделать это с помощью sed , но синтаксис мне неизвестен) - это начнется со строки 10 000 и далее.

perl -pe '$. > 10_000 && s/old_text/new_text/g' 

И если в RE (метасимволы) есть какие-то сложности, то их минимизация немного повысит эффективность механизма регулярных выражений.

2
12.10.2018, 17:12
2 ответа

Хотя Goro предоставил хорошее решение, для лучшего понимания я решил указать на некоторые проблемы с вашим кодом, которые мешают его правильной работе:

  • Вы собираете индексацию данных по переменной c, но никогда не меняете ее значение. Вы получите только последние данные, прочитанные из этого кода. Все предыдущие данные будут перезаписаны. Легким решением для этого было бы изменить /^company-type:/{type[c]=$2} на /^company-type:/{type[++c]=$2}.
  • Когда вы печатаете поле типа компании без видимой причины, вы удаляете из него первый символ:substr(type[x],2),будет получено «ngine1», а не «Engine1» (при условии, что в вашем данные, которые на самом деле удалялись ).
  • Это, вероятно, причина, по которой вы не видите вывод :вам нужно добавить запятые после place[x], phone[x]. Когда printf не находит запятую после place[x], она предполагает, что это последний из ее аргументов, что оставляет ему 2 аргумента меньше 8, требуемых оператором форматирования. Это приводит к синтаксической ошибке, которая останавливает скрипт. Я не знаю, почему вы не получили сообщение об ошибке синтаксиса.

Даже с этими исправлениями этот код особенно хрупок. Даже незначительное изменение форматирования может привести к сбою.

0
27.01.2020, 21:58

Это более простое решение:

awk -F'[>:]' 'BEGIN{print "company-type company-name address nr zipcode place phone fax"}{print $3}' data.txt | xargs -n8 | column -t

company-type  company-name  address  nr        zipcode  place      phone        fax
Engine1       STR           XX       4568789   08765    ljkmljubi  786754678    76756778
Engine2       STR           XX       7675678   87867    jkhgkl     87865        876578
Engine3       STR           XX       78675467  87657    uiytryui   87656788976  8976535467
Engine4       STR           XX       87657867  786578   kljhgryui  8976546789   989765

Разделитель полей -Fпозволяет awkсчитывать данные в столбцах на основе :и >, затем awkпечатает третий столбец, который эквивалентен требуемым фактическим данным, в то же время он создает заголовок.

Этот вывод направляется в xargs, который реорганизует его в восемь столбцов. Наконец, команда columnдобавляет табуляцию и равные пробелы между результирующими столбцами.

4
27.01.2020, 21:58

Теги

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