iterar sobre o arquivo e enviar linhas como parâmetros posicionais para outro arquivo

2

Gostaria de fazer uma iteração em um arquivo contendo datas (nomeadas dates.txt) no seguinte formato:

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

E passe cada campo de cada linha como um parâmetro posicional para outro script.

ie: o outro script é executado colocando o seguinte na linha de comando:

$ . the_script 2009 08 03 08 09

Eu tentei for i in $(./dates.txt);do echo ${i};done

mas obtenha:

./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found

disso eu posso dizer que está trabalhando em cada linha, mas talvez ficar pendurado em cada campo?

Por causa do acima, ainda fui capaz de descobrir como passar as linhas de leitura como parâmetros posicionais para o outro script. Não tem certeza de onde trabalhar isso? Ajuda por favor!

    
por geokrowding 05.01.2015 / 08:56

3 respostas

4

Talvez você queira dizer algo assim?

while read -d $'\n' i; do echo $i;done <./dates

while read -d $'\n' i; do . the_script $i;done <./dates
    
por 05.01.2015 / 09:16
2

Se o fornecimento ( . ) não for necessário, isso parece um trabalho para xargs :

xargs -a dates.txt -rL1 the_script
  • xargs lê uma linha de entrada e depois a utiliza para argumentos do comando especificado. O delimitador de linha padrão é a nova linha.
  • Podemos enviar dados para ele a partir de outros comandos ou especificar um arquivo de entrada usando -a .
  • Como exatamente uma linha deve ser usada por chamada de script, especificamos as opções -r (não executar se a linha estiver vazia) e -L (usar no máximo N linhas por chamada).
por 05.01.2015 / 12:14
0

Use cat em seu comando e certifique-se de usar o caminho correto para o nome do arquivo, se os scripts não estiverem no mesmo diretório. Se a lista for dates.txt , use $(cat ./dates.txt) . Erro de edição aqui. Inclua o arquivo .txt

Aqui está um exemplo:

Uma lista de datas com o nome dates.txt .

2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14

Um script chamado lstdates.sh para fazer eco dos planetas nessa lista. Editado Isso é executado em um sub shell para que o separador de campo interno (IFS) 1 não seja alterado fora do campo. subshell 2 .

#!/bin/bash
# Listing each date as an argument for 'the_script'.

# Parenthesis runs in a subshell    
( 
  # IFS line break
  IFS=$'2'
  for dates in $(cat ./dates.txt)
  do
    echo $(./the_script $dates)
  done
)

Por padrão, o IFS reconhece cada espaço em branco como o final de um campo. IFS=$'2' reconhece cada nova linha como o final de um campo. Se cada linha estiver entre aspas duplas, como "2009 08 03 08 09" , o IFS padrão funcionará.

the_script contém apenas o seguinte.

#!/bin/bash
echo $1

Referência: Guia avançado de script de script Capítulo 11. Loops e filiais

    
por 05.01.2015 / 09:32