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.