3

Я пытаюсь разбить несколько огромных файлов gz на сжатые по N-строке фрагменты.

Чтобы продемонстрировать, давайте рассмотрим следующее:

seq 100 | gzip > big_file0.gz

Я могу разделить это на несколько сжатых файлов по 10 строк следующим образом:

zcat big_file0.gz | split -l 10 --filter='gzip > $FILE.gz' - big_file0.

Предположим, у нас есть несколько больших файлов big_file0.gz , big_file1.gz ...

Теперь я хотел бы разделить каждый из этих файлов, используя GNU параллельно. Вот команда, которую я придумаю:

parallel "zcat {} | split -l 10 --filter='gzip > $FILE.gz' - {.}." ::: big_file0.gz big_file1.gz

Однако замена оболочки для $FILE не работает должным образом. $FILE заменяется пустой строкой, поэтому весь вывод записывается в файл с именем .gz .

Как я могу заставить подстановку $FILE работать как положено в параллельной GNU?

2 ответа2

3

Расширение переменных оболочки - это преобразование $FILE в пустую строку. Вам нужно поставить обратную косую черту перед $FILE чтобы оболочка не выполняла расширение.

0

Сегодня вы бы использовали опцию --pipe GNU Parallel:

parallel --seqreplace // "zcat {} | parallel --pipe -N 10 gzip '>{.}.{#}.gz'" ::: big_file0.gz big_file1.gz

Если вы согласны с добавлением big_file0.gz big_file1.gz это еще проще:

zcat big_file0.gz big_file1.gz | parallel --pipe -N 10 gzip '>{#}.gz'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .