Перемещение файла с подстановочным знаком и добавление метки времени к имени файла

Проблема в том, что, хотя URL-адрес предполагает, что это CSV, на самом деле это не так - общие тома, содержащие запятые, неправильно цитируются. Тем не менее, вам понадобятся дополнительные знания. В этом случае попробуйте изменить формат вывода с:

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

production:

"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 - в дальнейшем это сэкономит вам много времени.

Также обратите внимание на кавычки вокруг URL-адреса - они гарантируют, что специальные символы ( и в данном случае) не интерпретируются оболочкой.

0
17.08.2018, 20:03
1 ответ
  1. короче с переименованием (он не будет работать в случае разных файловых систем):

    переименовать '' "/dev/DataStage/myProject/Archive/TEST/ `date +%Y%m%d _%H%M `." /dev/DataStage/myProject/source/TEST/MyFile _*.csv

  2. с петлей

    для файла в /dev/DataStage/myProject/source/TEST/MyFile _*.csv ; делать имя_файла= `базовое имя $файл `mv $file /dev/DataStage/myProject/Archive/TEST/ `date +%Y%m%d _%H%M `.${filename} сделано

0
28.01.2020, 04:13

Теги

Похожие вопросы