importar dados de um arquivo de texto para um script bash

3

Eu preciso importar um arquivo de texto como este abaixo:

AMBI
CBNK
CCXI
CERE
CLACW
CNYD
DAEG
DLIA
DLLR
DNDN
DSGX
HAST
HIBB,
HPOL
IRDMZ
MARK
NEPT
NFEC
NINE
NRCIB
OMER
PLCC
PLPM
PSUN
UNTK

Há 25 entradas, preciso passá-las em um script bash.

Eu quero executar o programa uma vez para cada símbolo. Os símbolos são símbolos de ações da Nasdaq. Estou tentando fazer uma citação com o script.

Eu consegui fazer este comando manualmente:

sh stock (symbol) > /home/user/Desktop/stockquote.txt

ao inserir o (símbolo) manualmente, eu preciso de um script para fazer isso automaticamente.

    
por user177073 25.08.2013 / 05:37

3 respostas

2

Você está tentando ler cada linha como símbolo?

Tenha as 25 entradas em um arquivo chamado stocks.txt. Em seguida, use o seguinte script para iterar sobre cada linha no arquivo de estoques e processar o símbolo usando a função de estoque declarada no mesmo script:

while read symbol ; do 
  stock $symbol >> /home/user/Desktop/stockquote.txt 
done < stocks.txt
    
por 25.08.2013 / 06:03
1

Aparentemente, o título e o corpo da pergunta não pareciam o mesmo para mim. Aqui estão duas soluções:

Importando dados de um arquivo externo para um script Bash:

Leia o arquivo e armazene seu conteúdo como entradas em uma matriz. ( Nota : isso é viável dado o conteúdo do seu arquivo de texto. Se, por exemplo, qualquer linha no arquivo tiver várias palavras sem citações, a matriz assim formada não será a desejada.)

declare -a symbols=($(cat input_file.txt | tr '\n' ' '))

Agora, repita os itens da matriz symbols da seguinte maneira.

LOG_FILE=/home/user/Desktop/stockquote.txt    

for symbol in ${symbols[@]}  
do  
    # echo "Processing $symbol ..."  
    sh stock "$symbol" >> "$LOG_FILE"    
done

Na verdade, você pode incorporar isso no script chamado stock propriamente dito. Basta alterar o sh stock "$symbol" acima para algo assim:

f_process "$symbol" >> "$LOG_FILE"    

em que f_process é possivelmente uma função que processa o símbolo. Se você não quer escrever uma função, apenas coloque as linhas de código relevantes lá.

Transmitindo dados de um arquivo externo como argumentos para um script de shell:

Uma solução relacionada já foi postada por neowulf33 . Estou apenas reproduzindo isso com correções:

LOG_FILE=/home/user/Desktop/stockquote.txt 
while read symbol    
do  
    stock "$symbol" >> "$LOG_FILE"
done < input_file.txt
    
por 25.08.2013 / 08:22
0

Se você quiser fazer um loop pelas linhas de um arquivo, você pode usar o read integrado em um loop como este:

while IFS= read -r line; do
  echo "$line"
done <input_file.txt

O conteúdo da linha é armazenado na variável line (você pode escolher qualquer outro nome). Consulte Noções básicas sobre o IFS para obter mais explicações. Sem IFS= , o espaço em branco inicial ou final é removido, o que pode ser desejável no seu caso.

Tenha em atenção que >stockquote.txt trunca o ficheiro de saída de cada vez. Coloque-o em volta de todo o comando ou use >>stockquote.txt que é anexado ao arquivo. Se você usar >> , tome cuidado para que o arquivo não fique vazio quando o script for iniciado.

Este snippet executa o programa stock para cada linha e armazena a saída em stockquote.txt com uma linha em branco ( echo sem argumento) entre cada símbolo.

while read -r line; do
  stock "$line"
  echo
done <input_file.txt >stockquote.txt

Certifique-se de que stock seja executável. Se for um script de shell, certifique-se de que ele comece com #!/bin/sh . Se não estiver no caminho de pesquisa do comando $PATH , especifique o caminho explicitamente (por exemplo, ./stock se estiver no diretório atual).

Você também pode usar xargs , mas tenha em mente que sua sintaxe de entrada é peculiar: não usa novas linhas como delimitadores, mas espaço em branco e trata \'" como caracteres de aspas (com a sintaxe de entrada padrão - apenas para fazer pior ainda, o xargs tem sintaxes de entrada alternativas dependendo de suas opções de linha de comando). Para o seu caso de uso, isso provavelmente é adequado também, e é mais curto, mas você perde a oportunidade de ter espaços em branco ou citar caracteres em símbolos, para pular linhas de comentários, etc.

xargs -n 1 stock <input_file.txt >stockquote.txt
    
por 26.08.2013 / 13:49

Tags