我有一个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了,但如果它更合适,我就不会使用其他语言了。
答案 0 :(得分:3)
每行多个命令的原始while循环是DIRE!
sed -e '/"GVA"/w gva.file' -e '/"HBVL"/w hbvl.file' -n $file
sed
脚本说:
-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