Короткий ответ - «Нет» - вашим ограничивающим фактором для такого рода операций является дисковый ввод-вывод. Нет возможности передать 25 ГБ диска быстрее. Вы можете получить незначительное улучшение, если не редактируете на месте и записываете результат sed
на отдельный диск (если он у вас есть) - потому что таким образом вы можете читать с одного, пока вы пишете другому, в результате возникает немного меньше разногласий.
Вы можете немного ускорить его, не используя механизм регулярных выражений для каждой строки - например, используя perl (я почти уверен, что вы можете сделать это с помощью sed
, но синтаксис мне неизвестен) - это начнется со строки 10 000 и далее.
perl -pe '$. > 10_000 && s/old_text/new_text/g'
И если в RE (метасимволы) есть какие-то сложности, то их минимизация немного повысит эффективность механизма регулярных выражений.
Хотя Goro предоставил хорошее решение, для лучшего понимания я решил указать на некоторые проблемы с вашим кодом, которые мешают его правильной работе:
c
, но никогда не меняете ее значение. Вы получите только последние данные, прочитанные из этого кода. Все предыдущие данные будут перезаписаны. Легким решением для этого было бы изменить /^company-type:/{type[c]=$2}
на /^company-type:/{type[++c]=$2}
. substr(type[x],2),
будет получено «ngine1», а не «Engine1» (при условии, что в вашем данные, которые на самом деле удалялись ). Даже с этими исправлениями этот код особенно хрупок. Даже незначительное изменение форматирования может привести к сбою.
Это более простое решение:
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
добавляет табуляцию и равные пробелы между результирующими столбцами.