xargs, registros e entrada padrão

4

Eu tenho um arquivo de registros delimitado por 0 bytes.

Record 1, Line 1
Record 1, Line 2
[zero byte]
Record 2, Line 1
Record 2, Line 2

Gostaria de executar o comando "process.sh" uma vez para cada registro, com o registro como entrada padrão:

bash process-one-record-stdin.sh <record-contents

Posso fazer isso com xargs, paralelos ou alguma outra ferramenta? (Eu sei como usar bash scripting, mas eu prefiro usar ferramentas embutidas sempre que possível)

Motivação:

magic-xargs-type-command-here -0 all-records.txt -- xargs -d"\n" -- bash process-one-record-arguments.sh
    
por Zachary Vance 23.10.2014 / 11:40

2 respostas

1

Se você tem o GNU Parallel, você pode fazer isso:

parallel --rrs --recend '
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
' -N1 --pipe bash process-one-record-stdin.sh <record-contents

Todos os novos computadores têm vários núcleos, mas a maioria dos programas são de natureza serial e, portanto, não usam os vários núcleos. No entanto, muitas tarefas são extremamente paralelizáveis:

  • Execute o mesmo programa em muitos arquivos
  • Execute o mesmo programa para cada linha em um arquivo
  • Execute o mesmo programa para cada bloco em um arquivo

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh.

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma maneira direta de paralelizar é rodar 8 tarefas em cada processador:

OGNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Se o GNU Parallel não for empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

parallel --rrs --recend '
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
' -N1 --pipe bash process-one-record-stdin.sh <record-contents

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 24.10.2014 / 00:36
0

Can I do this with xarg

Com xargs, opções para usar:

--null -0 Input items are terminated by a null character instead of by whitespace,

-n max-args Use at most max-args arguments per command line.

$ echo -ne "line 111
$ echo -ne "line 111%pre%00line 222%pre%00%pre%00line 333%pre%00%pre%00" | \
     xargs -I '{}' --null -n 1 bash -c "echo handling this input: '{}'. OK"
handling this input: line 111. OK
handling this input: line 222. OK
handling this input: . OK
handling this input: line 333. OK
handling this input: . OK
00line 222%pre%00%pre%00line 333%pre%00%pre%00" | \ xargs -I '{}' --null -n 1 bash -c "echo handling this input: '{}'. OK" handling this input: line 111. OK handling this input: line 222. OK handling this input: . OK handling this input: line 333. OK handling this input: . OK
    
por 23.10.2014 / 11:59