Usando sed com parallel dá saída vazia ao redirecionar para arquivo

3

Estou usando o shell zsh . Eu estou tentando usar sed para substituir algum texto em muitos arquivos, usando paralelamente para acelerar o processo. Quando testei isso em um arquivo e deixei a saída do comando ir para stdout , vi o resultado esperado. Quando tentei redirecionar essa saída para um arquivo, recebi um arquivo vazio. O que está acontecendo? Aqui está um exemplo trivial usando um único arquivo de dados confeccionado que você pode recortar e colar para ilustrar ...

setopt interactivecomments
#  In this trivial example it is obviously non-sensical
#  to use parallel, but in reality I have many files...

#  Some very simple input data...
paste <(printf "%s\n" 'seq 1 4') <(printf "%s\n" 'seq 1 4') > ./input.txt
#  This looks like:
#1       1
#2       2
#3       3
#4       4


#  Pass data file to parallel and use sed to substitute.
#  e.g. want to replace line '3 3' with '3 33'
#  Output goes to stdout & seems correct...
z='find ./input.txt'
echo "$z" | parallel 'sed "s/\(^3.*3\)//"'
#1       1
#2       2
#3       33    ===> correct replacement
#4       4

# But redirecting to a file leads to empty file...
echo "$z" | parallel 'sed "s/\(^3.*3\)//" > {//}/result.txt'

# Empty file
cat ./result.txt

O que dá? Estou especificando algo incorretamente?

Estou usando:

  • Ubuntu 12.04.4 LTS
  • GNU parallel 20130522
  • GNU sed version 4.2.1
  • zsh 4.3.17
por Simon O'Hanlon 10.06.2014 / 13:00

1 resposta

3

Ao usar o redirecionamento dentro do comando para parallel , você tem que usar {} para colocar a entrada no lugar certo, como parâmetro para sed :

echo "$z" | parallel 'sed "s/\(^3.*3\)//" {} > {//}/result.txt'

Além disso, se {//} (ou qualquer outra string de substituição) for usada, parallel não anexará a entrada no final do comando automaticamente. (Nesse caso, isso seria errado de qualquer maneira, como seria após o redirecionamento.)

Essencialmente, o código da pergunta é executado

sed "s/(^3.*3\)//" > ./result.txt

mas precisa ser

sed "s/(^3.*3\)//" ./input.txt > ./result.txt
    
por 10.06.2014 / 13:18