Usando o comando cURL, como obter dados de ações que retornam * sem * vírgulas e espaços?

0

O que eu posso adicionar ao script abaixo para que ele busque os dados de estoque e o traga de volta SEM vírgulas e espaços? Por exemplo, as ações da GOOG Outstanding são 675.000.000.

Eu desejo a saída de 675000000 para o meu arquivo txt. (sem espaços ou vírgulas ou pontuação). Eu preciso de funcionalidade decimal no entanto para os preços das ações embora).

cd desktop/quoteUpdate
while true
do
 curl -o quotes.txt -s "http://download.finance.yahoo.com/d/quotes.csv?s=avxl,goog,aapl&f=snl1c6j2s6f6"
 sed -i '.bak' 's/,/ /g' quotes.txt # replace commas with spaces
echo UPDATED:
date
sleep 10
done
    
por Chris Dormani 14.01.2015 / 23:29

1 resposta

2

O problema é que, embora a URL sugira que é um CSV, na verdade não é - os volumes de compartilhamento que contêm vírgulas não são citados corretamente. Dito isto, você precisará empregar conhecimento adicional. Nesse caso, tente alterar o formato da saída de:

http://download.finance.yahoo.com/d/quotes.csv?s=avxl,goog,aapl&f=snl1c6j2s6f6

produzindo:

"AVXL","ANAVEX LIFE SCIEN",0.1799,"-0.0041",    38,260,000,0,    23,703,000
"GOOG","Google Inc.",500.87,"+4.69",   678,365,000,67.911B,   572,967,000
"AAPL","Apple Inc.",109.80,"-0.42",  5,864,839,000,182.8B,  5,856,335,000

para, por exemplo:

http://download.finance.yahoo.com/d/quotes.csv?s=avxl,goog,aapl&f=sl1c6sj2ss6sf6

que produz:

"AVXL",0.1799,"-0.0041","AVXL",    38,260,000,"AVXL",0,"AVXL",    23,703,000
"GOOG",500.87,"+4.69","GOOG",   678,365,000,"GOOG",67.911B,"GOOG",   572,967,000
"AAPL",109.80,"-0.42","AAPL",  5,864,839,000,"AAPL",182.8B,"AAPL",  5,856,335,000

Você pode analisar isso com, por exemplo:

sed 's/"[A-Z][^"]*",/ & /g' \
| awk -- '{
        gsub("\"", "", $2);
        gsub(",", "", $4);
        gsub(",", "", $8);
        print $1 $2 $4 "," $6 $8
    }'

que lhe dará algo mais como CSV:

"AVXL",0.1799,-0.0041,38260000,0,23703000
"GOOG",500.87,+4.69,678365000,67.911B,572967000
"AAPL",109.80,-0.42,5864839000,182.8B,5856335000

O truque é que o símbolo ticker é uma coisa bem tangível e você pode usá-lo como uma âncora onde você precisa.

O encantamento mágico acima faz isso:

  • a invocação de sed envolve as ocorrências dos símbolos de ticker (que são cadeias duplas entre aspas começando com uma letra maiúscula) com espaços, marcando assim efetivamente uma lista separada por espaços em branco

  • awk primeiro substitui todas as aspas duplas (primeira linha) e vírgulas (segunda e terceira linha) nos campos 2 (para evitar que o campo de mudança de preço seja cotado em dobro e, portanto, seja tratado como uma sequência em vez de flutuante número do ponto, se você começar a processá-lo com uma planilha) e 4 e 8, respectivamente. A última linha imprime os campos modificados (e omite os símbolos de ticker adicionais agora supérfluos).

Assim, no final, você pode fazer assim:

curl -s 'http://download.finance.yahoo.com/d/quotes.csv?s=avxl,goog,aapl&f=sl1c6sj2ss6sf6' \
| sed 's/"[A-Z][^"]*",/ & /g' \
| awk -- '{
        gsub("\"", "", $2);
        gsub(",", "", $4);
        gsub(",", "", $8);
        print $1 $2 $4 "," $6 $8
    }'

Observe as barras invertidas \ no final das linhas - elas garantem que os comandos não sejam chamados separadamente, mas sim como se estivessem em uma linha. Essa notação é usada para melhorar a legibilidade. As barras invertidas não são usadas no script AWK de quatro linhas, uma vez que elas estão entre aspas e as novas linhas são, portanto, parte do comando inteiro. E não se esqueça de ler alguns tutoriais básicos sobre scripts de shell UNIX - você economizará muito tempo depois.

Observe também as aspas em volta do URL - elas garantem que os caracteres especiais ( & neste caso) não sejam interpretados pelo shell.

    
por 15.01.2015 / 01:55