Linux上大文件切割以及批量并发处理

随笔 0 882
小小草
小小草 2021年12月11日 23:20 发表

一、环境说明

某次项目需求中,在Linux上有批文本文件,文件文件都有几个G大,几千万行的数据。无论在Linux和Windows打开这么大的文件,基本上打开要卡半天,更别说编辑。

因此想到使用split命令对大文件进行切割,再分隔取其中的字段,最后导出文件(保留有用的字段)。

二、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

 

点赞 0 收藏(0)    分享
相关标签: linux
问题没解决?让AI助手帮你作答 AI助手
0 个评论
  • 消灭零评论