我可以在下面的脚本中添加什么,以便它获取股票数据并将其返回,而不需要任何逗号和空格?例如,GOOG 流通股为 675,000,000 股。
我希望我的 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 中的所有双引号(第一行)和逗号(第二行和第三行)(以防止价格更改字段被双引号引用,从而如果您随后开始处理它,则被视为字符串而不是浮点数电子表格)分别为 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
}'
请注意\
行末尾的反斜杠 - 这些可确保命令不会单独调用,而是就像它们在一行上一样。该符号用于增强可读性。四行 AWK 脚本中不使用反斜杠,因为反斜杠被引号包围,因此新行是整个命令的一部分。并且一定要阅读一些有关 UNIX shell 脚本编写的基本教程 - 它将在以后为您节省大量时间。
另请注意 URL 周围的引号 - 这些引号可确保&
shell 不会解释特殊字符(在本例中)。