2012-07-03 3 views
1

У меня есть некоторые файлы, состоящие из конца дня фондовых данных в следующем формате:Как преобразовать группу CSV-файлов в другую группу файлов csv (с разными именами файлов и форматом)?

Имя файла: NYSE_20120116.txt

<ticker>,<date>,<open>,<high>,<low>,<close>,<vol> 
A,20120116,36.15,36.36,35.59,36.19,3327400 
AA,20120116,10.73,10.78,10.53,10.64,20457600 

Как я могу создать файлы для каждого символа? Например, для компании

Имя файла: a.txt

<ticker>,<date>,<open>,<high>,<low>,<close>,<vol> 
A,20120116,36.15,36.36,35.59,36.19,3327400 
A,20120117,39.76,40.39,39.7,39.99,4157900 
+0

Можно ли удалить столбец тикера из полученных файлов, изменив скрипт? – skiabox

ответ

2

Вы хотите разделить первый файл на уровне записи, то маршрут каждую строку в другой файл на основе значения первого поля ?

# To skip first line, see later 
cat endday.txt | while read line; do 
    # Careful with backslashes here - they're not quote signs 
    # If supported, use: 
    # symbol=$(echo "$line" | cut -f1 -d,) 
    symbol=`echo "$line" | cut -f1 -d,` 

    # If file is not there, create it with a header 
    # if [ ! -r $symbol.txt ]; then 
    # head -n 1 endday.txt > $symbol.txt 
    # fi 
    echo "$line" >> $symbol.txt 
done 

Не очень эффективно: Perl или Python были бы лучше.

Если у вас есть несколько файлов в директории (заметьте, вы должны удалить их самостоятельно, или они будут обработаны снова и снова ...), вы можете сделать:

for file in *.txt; do 
    echo "Now processing $file..." 
    # A quick and dirty way of ignoring line number 1 --- start at line 2. 
    tail -n +2 $file | while read line; do 
     # Careful with backslashes here - they're not quote signs 
     # If supported, use: 
     # symbol=$(echo "$line" | cut -f1 -d,) 
     symbol=`echo "$line" | cut -f1 -d,` 

     # If file is not there, create it with a header 
     # if [ ! -r $symbol.txt ]; then 
     # head -n 1 $file > $symbol.csv 
     # fi 
     # Output file is named .CSV so as not to create new .txt files 
     # which this script might find 
     echo "$line" >> $symbol.csv 
    done 
    # Change the name from .txt to .txt.ok, so it won't be found again 
    mv $file $file.ok 
    # or better move it elsewhere to avoid clogging this directory 
    # mv $file /var/data/files/already-processed 
done 
+0

Можно ли добавить внешний цикл к этому скрипту, чтобы мне не приходилось делать это для каждого исходного файла? Еще раз спасибо. – skiabox

+0

Я получаю следующее сообщение: Сценарий запущен, выходной файл является машинописным шрифтом, а затем у меня есть небольшой файл машинописного файла, созданный в папке. Я использую оболочку bash с лаком macos. – skiabox

+0

Я исправил это (мне пришлось набирать ./script).Но ошибка, которую я получаю, это: ./script: строка 5: $ symbol.txt: неоднозначный перенаправление ' – skiabox

Смежные вопросы