Что вы получаете от Yahoo! это данные в CSV-формате. Формат слишком сложен для bash (или даже sed или awk) для правильного разбора в одной строке. (Будучи полностью способным к работе с машиной Тьюринга, любой инструмент может это сделать, это будет просто не красиво.)
Ваша непосредственная проблема с приведенным выше сценарием состоит в том, что sed
не предоставляется никаких входных данных для работы, поэтому ваш сценарий зависает (после завершения curl
), потому что sed
ожидает на stdin
. Возможно, вы хотите добавить "quotes.txt" в текущую командную строку sed
:
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' quotes.txt
Но как только вы справитесь с этим, вы все равно будете несчастны, потому что команда sed
не анализирует CSV-данные как таковые. Вам понадобится какой-нибудь инструмент для обработки CSV - найдите пакет для разбора CSV, написанный для вашего любимого языка сценариев. В случае Tcl, например, CSV-синтаксический анализ доступен как часть tcllib .
Наконец, если вам действительно не нужно правильно обрабатывать все возможности CSV, а только убедиться, что числа в третьем столбце понятны Excel, вы можете обмануть что-то вроде:
curl -o - -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1" | \
awk -F, '{
sub("^ *", "", $3); # Start with 3rd field by stripping leading spaces
for (i = 4; i < NF; i++) # Append other fields to 3rd - but the last one
$3 = $3 $i;
print $1 "," $2 "," $3 "," $NF
}'
Вышеуказанный вызов отправляет данные непосредственно из curl
в awk
(в обход промежуточного создания файла). Если вам нужны данные в файле (например, для загрузки в Excel), перенаправьте в него окончательный вывод awk
:
.... awk ..... > quotes.csv
Ничего специфичного для bash в этом примере, кстати, любая оболочка не подойдет. Обратите внимание, что этот awk
скрипт только изменяет третий столбец (добавляя к нему последующие "столбцы", кроме самого последнего - NF). Также обратите внимание, что произойдет сбой, если в имени одной из корпораций будет запятая. Если это проблема для вас, этого можно избежать, используя кавычки (") вместо запятых, чтобы найти числа, которые должны быть объединены вместе ... Но лучше всего, опять же, будет относиться к данным как к правильному CSV с помощью расширения с поддержкой CSV для вашего любимого языка сценариев.