use o comando “read” para passar linhas como parâmetros posicionais para um shell script

1

O seguinte arquivo é executado, mas não está fazendo nada, mas não causa erro ...

while read dates; do ./avg_hrly_all_final.sh ${dates}; done < ./dates_all.csv

Eu tenho uma lista de datas em "dates_all.csv" que têm o seguinte formato:

2005 01
2005 02
2005 03

E o script que estou chamando de "avg_hrly_all_final.sh" funciona passando 2 parâmetros posicionais, por exemplo:

./avg_hrly_all_final.sh 2005 01 

ACOMPANHAMENTO

xargs -n2 ./the_script.sh <./dates_to_pass.csv

OR

while read dates; do ./the_script.sh ${dates}; done <./dates_to_pass.csv

trabalho, apenas certifique-se de que as datas do arquivo que está sendo passado sejam da mesma variedade "End of Line" que a máquina que você está executando o comando on expects;)

    
por geokrowding 01.03.2015 / 08:50

2 respostas

3

Este é um trabalho provável para xargs :

printf %s\n '#!/bin/sh' 'printf "<%s>\n" "$$" "$@"' >avg_hourly.sh
chmod +x ./avg_hourly.sh
xargs -n2 ./avg_hourly.sh <<\IN
2005 01
2005 02
2005 03
IN

xargs será dividido nos espaços por padrão e invocará o comando especificado uma vez por -n2 ocorrendo argumentos. Acabei de escrever um pequeno manequim avg_hourly.sh script que imprime seus argumentos um por linha, conforme delimitado em cada extremidade por < e > após seu PID no mesmo formato. As impressões acima:

<1115>
<2005>
<01>
<1116>
<2005>
<02>
<1117>
<2005>
<03>

... apenas para demonstrar. Você deve usar <./dates_all.csv em vez do meu <<\IN here-document como entrada, embora, provavelmente.

    
por 01.03.2015 / 09:33
1

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

parallel --colsep ' ' ./avg_hrly_all_final.sh {1} {2} :::: ./dates_all.csv

Se a primeira linha do arquivo csv for o cabeçalho, você poderá fazer algo como:

parallel --header : --colsep ' ' ./avg_hrly_all_final.sh {Year} {Month} :::: ./dates_all.csv

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 forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-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:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

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 01.03.2015 / 12:14