Как использовать опцию "фильтр" для GNU split с параллельной GNU?

Я пытаюсь разбить несколько огромных файлов 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 ответа

Решение

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

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

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'
Другие вопросы по тегам