使用sed动态生成文件名

时间:2009-10-08 22:23:23

标签: shell sed

我有一个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

部分问题是文件的大小。它大概是39mb。我最初的尝试看起来像这样:

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 MB,我无法想象需要多长时间。

我想做的是将品牌拉出线并将该行写入以该品牌命名的文件。我可以删除该品牌,但我现在不知道如何使用它来创建文件。我已经开始使用sed了,但如果它更合适,我就不会使用其他语言了。

3 个答案:

答案 0 :(得分:3)

每行多个命令的原始while循环是DIRE!

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

sed脚本说:

  • 将与GVA标记匹配的行写入gva.file
  • 将与HBVL标记匹配的行写入hbvl.file
  • 并且不打印任何其他内容('-n')

请注意,sed的不同版本可以处理不同数量的辅助文件。如果您需要一次超过20个输出文件,您可能需要查看其他技术(但测试您的计算机上的限制)。如果文件已排序,以便所有GVA记录一起显示,然后显示所有HBVL记录,则可以考虑使用csplit。或者,像Perl这样的脚本语言可以处理更多。如果超过了进程允许的文件描述符数量,则单次传递数据文件就很难进行拆分。

答案 1 :(得分:1)

grep '"GVA"' $file >GVA.txt
grep '"HVBL"' $file >HVBL.txt

答案 2 :(得分:1)

# 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