cURLコマンドを使用してコンマやスペースなしで*返品された株式データを取得するにはどうすればよいですか?

cURLコマンドを使用してコンマやスペースなしで*返品された株式データを取得するにはどうすればよいですか?

株式データを取得してコンマやスペースなしで返すように、以下のスクリプトに何を追加できますか?たとえば、GOOGの発行済株式数は6億7500万株です。

私のtxtファイルは675000000を出力したいです。 (スペース、カンマ、句読点は使用できません。) ただし、株価の場合は小数点関数が必要です。

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

ベストアンサー1

問題は、URLにCSVと表示されていますが、そうではありません。コンマを含む共有ボリュームが正しく参照されません。これは、追加の知識を適用する必要があることを意味します。この場合は、出力形式を変更してみてください。

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

生産:

"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

たとえば、

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

生産する:

"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

たとえば、次のように使用できます。

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

これにより、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

秘訣は、ティッカーがよく一致するので、必要に応じてアンカーとして使用できることです。

上記の魔法の呪文は次のことを行います。

  • このsed呼び出しは、ティッカー記号(大文字で始まる二重引用符で囲まれた文字列)の発生を囲むスペースで区切られたリストとして効果的に表示されます。

  • awkフィールド2で、すべての二重引用符(最初の行)とコンマ(2行目と3行目)を置き換えることから始めます(価格変更フィールドが二重引用符で囲まれて浮動小数点スプレッドシートの代わりに処理を開始すると文字列として処理されるのを防ぐするため)。 )はそれぞれ4と8です。最後の行は変更されたフィールドを印刷します(そして、重複する追加の株式記号は省略されます)。

結局、次のようにすることができます。

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
    }'

\行末のバックスラッシュに注意してください。これにより、コマンドは個別に呼び出されるのではなく、1行にあるかのように呼び出されます。このシンボルは、読みやすさを向上させるために使用されます。バックスラッシュは引用符で囲まれているため、4行のAWKスクリプトではバックスラッシュを使用しません。したがって、新しい行はコマンド全体の一部です。そして、UNIXシェルスクリプトに関するいくつかの基本的なチュートリアルを読んでください。これにより、後で多くの時間を節約できます。

また、URLの周りに引用符を書き留めます。これ&により、シェルが特殊文字(この場合)を解釈しないようにします。

おすすめ記事