Paralelizar sed dá saída diferente

2

Tentando paralelizar uma operação sed, no entanto, enquanto a versão paralela funciona, ela retorna uma saída errada.

A operação sed que eu gostaria de paralelizar (funciona)

sed 's/\s.*$// ; s/\(.*\)/\L/' < oldfile.txt > newfile.txt

Minha versão paralela da operação sed acima (não funciona corretamente por algum motivo):

parallel -a oldfile.txt -k --block $BYTES --pipe-part "sed 's/\s.*$// ; s/\(.*\)/\L/'" > newfile.txt
    
por HashWizard 14.05.2017 / 16:27

2 respostas

4

Geralmente, isso ocorre devido a citações duplas.

As citações são irritantes, então tente usar uma função de shell:

mysed() {
    sed 's/\s.*$// ; s/\(.*\)/\L/'
}
export -f mysed

parallel -a oldfile.txt -k --block -1 --pipe-part mysed > newfile.txt
    
por 14.05.2017 / 17:24
2

GNU parallel invoca o comando que você especifica através de um shell. Isso é ocasionalmente conveniente, mas geralmente é difícil, como você descobriu, por causa dos problemas de cotação e da dependência da variável de ambiente SHELL . (Ole e eu já tivemos palavras sobre isso.)

Você tem que dizer em paralelo que o que você está passando é um executável com argumentos , ao invés do comportamento padrão que assume que os argumentos são um comando a ser executado pelo programa chamado pela variável de ambiente SHELL , dividida arbitrariamente em partes que são unidas com um espaço entre elas . Não existe tal opção; o mais parecido é dizer paralelamente para citar o comando para que o shell acabe executando o comando correto.

parallel -a oldfile.txt -k --block $BYTES --pipe-part -q sed 's/\s.*$// ; s/\(.*\)/\L/' > newfile.txt
    
por 16.05.2017 / 02:20