某次项目需求中,在Linux上有批文本文件,文件文件都有几个G大,几千万行的数据。无论在Linux和Windows打开这么大的文件,基本上打开要卡半天,更别说编辑。
因此想到使用split命令对大文件进行切割,再分隔取其中的字段,最后导出文件(保留有用的字段)。
-a、 --后缀长度=N生成长度为N的后缀(默认值2) --附加后缀=后缀向文件名附加附加后缀 -b、 --bytes=大小每个输出文件放置大小字节 -C、 --line bytes=每个输出文件的最大行大小字节 -d、 --数字后缀[=FROM]使用数字后缀代替字母;从更改开始值(默认值为0) -l、 --行数=每个输出文件的行数
##每200万行进行切割,使用数字后缀,后缀的长度为3,即最大999 split -l 2000000 aaaa.txt -d -a 3
直接写了个脚本,要用时直接跑下就完成了。这里限制后台并发处理的作用是为了防止文件后台处理时,并发数过多,导致机器卡住(数据量大的情况下还是限制并发数比较好)。
这里其实还可以在加个循环,或者位置变量等,从而批量处理一批大文件,就不用手动执行一个个文件了。shell脚本编写每个人都不同,脚本只进行参考,只提供个简单的思路。
##指定需要并发的线程数,根据机器的性能进行修改,不然过多并发数会影响机器性能 thread=20 tmp_fifofile=/tmp/$$.fifo work=./work if [ -d $work ];then cd $work else mkdir $work cd $work fi ##对原文件进行切割,生成临时文件,文件名为“x001”,“x002”.... split -l 5000000 aaaa.txt -d -a 3 mkfifo $tmp_fifofile exec 7<> $tmp_fifofile rm -f $tmp_fifofile for t in `seq $thread` do echo >&7 done ##对原文件内容进行截取,再导出为新文件,名为bbbb.txt。原文件是按,进行分隔,根据实际情况修改。 for i in `ls x*` do read -u 7 { cat $i | awk -F, '{print $1","$2","$3","$4","$5}' >> bbbb.txt echo $i >> dns_data.log echo >&7 }& done exec 7>&- ##最后删除前面分隔的临时文件 find ./ -type f -name "x*"|xargs rm -f