Лучшее, что я смог сделать с помощью sed, - это скрипт:
s/[\s\t]*|[\s\t]*/|/g
s/[\s\t]*$//
s/^|/null|/
В моих тестах это работало примерно на 30% быстрее, чем ваш скрипт sed. Увеличение производительности происходит за счет объединения первых двух регулярных выражений и отсутствия флага «g» там, где он не нужен.
Тем не менее, 30% -ное ускорение - это лишь незначительное улучшение (для запуска вышеуказанного сценария в вашем файле данных объемом 1 ГБ все равно потребуется около полутора часов). Я хотел посмотреть, смогу ли я сделать что-нибудь лучше.
В конце концов, ни один другой метод, который я пробовал (awk, perl и другие подходы с помощью sed), не оказался лучше, за исключением, конечно, простой реализации на C. Как и следовало ожидать от C, код немного многословен для публикации здесь, но если вы хотите, чтобы программа работала быстрее, чем любой другой метод, вы можете взглянуть на нее .
В моих тестах реализация C завершается примерно за 20% времени, необходимого для вашего сценария sed. Поэтому запуск вашего сервера Unix может занять около 25 минут.
Я не тратил много времени на оптимизацию реализации C. Без сомнения, есть ряд мест, где алгоритм может быть улучшен, но, честно говоря, я не знаю, можно ли сэкономить значительное количество времени сверх того, что он уже достиг. Во всяком случае, я думаю, что это определенно накладывает верхний предел на то, какую производительность вы можете ожидать от других методов (sed, awk, perl, python и т. Д.).
Редактировать: В оригинальной версии была небольшая ошибка, из-за которой в конце вывода могла быть напечатана неправильная вещь (например, могла выводиться ноль, которой там быть не должно). Сегодня у меня было время взглянуть на это и исправить это. Я также оптимизировал вызов на strlen()
, что дало ему еще один небольшой прирост производительности.