Como eu uso a opção “filter” do GNU split com o GNU paralelo?

3

Estou tentando dividir um número enorme de arquivos gz em blocos compactados com gzip de N-line.

Para demonstrar, vamos considerar o seguinte:

seq 100 | gzip > big_file0.gz

Eu posso dividir isso em vários arquivos compactados de 10 linhas da seguinte maneira:

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

Vamos supor que temos vários arquivos grandes big_file0.gz , big_file1.gz ...

Eu gostaria agora de dividir cada um desses arquivos usando o GNU paralelo. Aqui está o comando que eu sugiro:

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

No entanto, a substituição do shell por $FILE não funciona conforme o esperado. $FILE é substituído por uma string vazia, então toda a saída é gravada em um arquivo chamado .gz .

Como posso obter a substituição de $FILE para funcionar como esperado no GNU paralelo?

    
por saffsd 23.10.2012 / 02:43

2 respostas

3

A expansão de variáveis do shell está convertendo $FILE em uma string vazia. Você precisa colocar uma barra invertida na frente de $FILE para impedir que o shell faça a expansão.

    
por 23.10.2012 / 04:37
0

Hoje você usaria a opção --pipe do GNU Parallel:

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

Se você está certo em adicionar big_file0.gz big_file1.gz , é ainda mais simples:

zcat big_file0.gz big_file1.gz | parallel --pipe -N 10 gzip '>{#}.gz'
    
por 27.04.2015 / 18:36