Команда SED в Unix не работает с размером файла более 3 ГБ - PullRequest
0 голосов
/ 26 декабря 2018

Команда Sed не работает в Unix для файла размером более 3 ГБ, чтобы удалить из файла возврат каретки и символ новой строки.

Я пытаюсь удалить символ новой строки из файла с разделителями канала.

код:

sed -i ':a;N;$!ba;s/\n|/|/g'   File.txt

Это файл с разделителем каналов, поэтому я сначала ищу конец строки, а затем заменяю символ новой строки на канал.

Пример ввода:

Test|A|B|C
|D

После замены - Ожидаемый вывод:

Test|A|B|C|D

Команда Sed работает нормально для всех файлов, размер которых меньше 3 ГБ, но не для файлов сбольший размер.

1 Ответ

0 голосов
/ 26 декабря 2018

Проблема в том, что ваша команда sed сначала считывает весь файл в память:

:a        # label a
N         # add next line to pattern space
$!ba      # if not on last line ($!) branch to label a

Это в конечном итоге приведет к ошибке при достаточно большом вводе, потому что пространство шаблона хранится в основной памяти.

Учитывая простую замену, которая вам нужна, достаточно выполнить замену на пары линий, например:

:a        # label a
N         # add next line to pattern space
s/\n|/|/  # substitute new-line pipe by pipe
ta        # if last substitution was successful branch to label a
P         # print first line of pattern space
D         # delete first line of pattern space

В качестве однострочного:

sed -n ':a; N; s/\n|/|/; ta; P; D' File.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...