Использование sed для динамического создания имени файла - PullRequest
0 голосов
/ 09 октября 2009

У меня есть файл CSV, который я хотел бы разделить на основе поля в файле. По сути, может быть две марки, GVA и HBVL. Я хотел бы разбить файл на файл для каждого бренда, прежде чем импортировать его в базу данных.

Образец файла CSV

"D509379D5055821451C3695A3752DCCD",'1900-01-01 01:00:00',"M","1740","GVA",'2009-07-01 13:25:00',0
"159A58BE41012787D531C7157F688D86",'1900-01-01 00:00:00',"V","1880","GVA",'2008-06-06 11:21:00',0
"D0BB5C058794BBE4478DDA536D1E4872",'1900-01-01 00:00:00',"M","9270","GVA",'2007-09-18 13:21:00',0
"BCC7096803E5E60E05DC12FB9951E0CF",'1900-01-01 00:00:00',"M","3500","HBVL",'2007-09-18 13:21:00',1
"7F85FCE6F13775A8A3054E3438B81599",'1900-01-01 00:00:00',"M","3970","HBVL",'2007-09-18 13:20:00',0

Часть проблемы - размер файла. Это около 39 МБ. Моя первоначальная попытка это выглядела так:

while read line ; do

    name=`echo $line | sed -n 's/\(.*\)"\(GVA\|HBVL\)",\(.*\)$/\2/ p' | tr [:upper:] [:lower:] `
    info=`echo $line | sed -n 's/\(.*\)"\(GVA\|HBVL\)",\(.*\)$/\1\3/ p'`

    echo "${info}" >> ${BASEDIR}/${today}/${name}.txt

done < ${file}

Примерно через 2,5 часа было обработано только около 1/2 файла. У меня есть другой файл, который может иметь размер до 250 МБ, и я не могу себе представить, сколько времени это займет.

То, что я хотел бы сделать, это вывести марку из строки и записать строку в файл с именем марки. Я могу удалить марку, но я не знаю, как использовать ее для создания файла. Я начал с sed, но я не рекомендую использовать другой язык, если он более уместен.

Ответы [ 3 ]

3 голосов
/ 09 октября 2009

Первоначальный цикл while с несколькими командами в строке - DIRE!

sed -e '/"GVA"/w gva.file' -e '/"HBVL"/w hbvl.file' -n $file

Сценарий sed гласит:

  • написать строки, соответствующие тегу GVA, в gva.file
  • записать строки, соответствующие тегу HBVL, в hbvl.file
  • и больше ничего не печатать ('-n')

Обратите внимание, что разные версии sed могут обрабатывать разное количество вспомогательных файлов. Если вам нужно больше, скажем, двадцати выходных файлов одновременно, вам, возможно, придется взглянуть на другую технологию (но проверьте, какое ограничение на вашей машине). Если файл отсортирован так, что все записи GVA отображаются вместе, за которыми следуют все записи HBVL, вы можете рассмотреть возможность использования csplit. Альтернативно, язык сценариев, такой как Perl, мог бы обрабатывать больше. Если вы превысите количество файловых дескрипторов, разрешенных для вашего процесса, разделение на один файл данных будет затруднено.

1 голос
/ 09 октября 2009
# awk -F"," '{o=$5;gsub(/\"/,"",o);print $0 > o}' OFS="," file
# more GVA
"D509379D5055821451C3695A3752DCCD",'1900-01-01 01:00:00',"M","1740","GVA",'2009-07-01 13:25:00',0
"159A58BE41012787D531C7157F688D86",'1900-01-01 00:00:00',"V","1880","GVA",'2008-06-06 11:21:00',0
"D0BB5C058794BBE4478DDA536D1E4872",'1900-01-01 00:00:00',"M","9270","GVA",'2007-09-18 13:21:00',0
# more HBVL
"BCC7096803E5E60E05DC12FB9951E0CF",'1900-01-01 00:00:00',"M","3500","HBVL",'2007-09-18 13:21:00',1
"7F85FCE6F13775A8A3054E3438B81599",'1900-01-01 00:00:00',"M","3970","HBVL",'2007-09-18 13:20:00',0
1 голос
/ 09 октября 2009
grep '"GVA"' $file >GVA.txt
grep '"HVBL"' $file >HVBL.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...