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

2155
saffsd

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

3

2 ответа на вопрос

3
Kyle Jones

Shell expansion of variables is converting $FILE to an empty string. You need to put a backslash in front of $FILE to prevent the shell from doing the expansion.

0
Ole Tange

Сегодня вы бы использовали --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' 

Похожие вопросы