Как использовать опцию "фильтр" для 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'