博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用shell脚本快速排序和去重文件数据
阅读量:6309 次
发布时间:2019-06-22

本文共 4606 字,大约阅读时间需要 15 分钟。

  前面写过一篇通过shell脚本去重10G数据的文章,见《》。然而今天又碰到另外一个业务,业务复杂度比上次的单纯去重要复杂很多。找了很久没有找到相应的办法,于是用shell脚本程序去处理。具体业务逻辑:

  1、首先根据给定指定进行排序

  2、排序后对给定字段进行去重,去重的规则如下:

    a)排序后如果相邻N行给定字段值相同的行数不超过两行,则两行都保留。

    a)排序后如果相邻N行给定字段值相同的行数超过两行,则保留首行和尾行。

  就这样一个业务逻辑,其实看起来并不是太难。但是问题来了,怎么才能在10~20G的数据中快速地进行处理呢?网上找了很久没找到相应的处理办法,于是先用一种相对笨的办法实现。

  测试数据:

F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ssF250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ssF250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ssF250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ssA0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ssA0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss

  shell脚本:

if [ "$#" != "2" ]; then        echo "Usage: 参数1:文件路径,参数2:文件名。"        exitfi#源文件所在目录filepath=$1#源文件绝对路径orgfile=$filepath"/"$2#合并字段后的临时文件#mergerfile="$orgfile"_merge.txt#排序后的临时文件sortfile="$orgfile"_sort.txt#最终结果文件result_unique="$orgfile"_result_unique.txtecho "">$result_unique#echo "文件:$orgfile"#echo "开始合并字段..."#awk 'BEGIN{ FS=",";}{ print $1","$2","$3","$4","$5","$6","$7","$1$3$4 }' $orgfile > $mergerfile#echo "字段合并结束..."echo "文件排序 start..."#sort -t $"," -k 1,1 -k 9,9 $mergerfile >$sortfilesort -t $"," -k 1,2 $orgfile >$sortfileecho "文件排序 end..."printf "***********文件比较 start**************************\n"echo "while read line <$sortfile"cnt=0#首行firstline=""#尾行lastline=""#上一次比较的keylastKey=""#文件行数linecount=`sed -n '$=' $sortfile`i=1echo "linecount=========>>>>>>>$linecount"while read line || [[ -n "$line" ]];do  echo $line;  #合并需要比较的字段  compare=`echo "$line"|awk -F ',' '{print $1$3$4}'`  echo "compare=====$compare"  #判断字符串是否相等  if [ "$i" != "$linecount" -a "$lastKey" = "$compare" ];then    echo "[ = ]"    cnt=$(expr $cnt + 1)    lastline="$line"  else    #首次进来    if [ "$firstline" = "" ];then        firstline=$line        cnt=1        #echo "$firstline" >> $result_unique    fi    #echo "----$i---------------->>>>>>>>>>>$cnt"    if [ $cnt -gt 1 -o "$i" == "$linecount" ];then        echo "----$i---------------->>>>>>>>>>>$cnt"        if [ "$i" != "$linecount" -a "$lastline" != "" ];then                echo "$lastline" >> $result_unique                echo "$line" >> $result_unique        fi        # 最后一行的特殊处理        if [ "$i" == "$linecount" ];then                echo "================last line==================="                echo "$line" >> $result_unique        fi        firstline="$line"        lastline="$line"        cnt=1    elif [ $cnt -eq 1 ];then        firstline=$line        lastline="$line"        cnt=1        echo "$lastline" >> $result_unique    fi  fi  # 对比key  lastKey="$compare"  let i++done <$sortfileecho "*******************文件 $orgfile 处理结束***************************"echo "*******************结果文件 $result_unique ***************************"exit

  给脚本添加执行权限:

chmod +x uniquefile.sh

  执行shell脚本

sh ./uniquefile.sh ./文件路径 文件名

  结果:

[root@xddsdsdsddssd ~]# sh uniquefile.sh ./ testfile.csv 文件排序 start...文件排序 end...***********文件比较 start**************************while read line <.//testfile.csv_sort.txtlinecount=========>>>>>>>6A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,sscompare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,sscompare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0[ = ]F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,sscompare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E----3---------------->>>>>>>>>>>2F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,sscompare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E[ = ]F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,sscompare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E[ = ]F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,sscompare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E----6---------------->>>>>>>>>>>3================last line===================*******************文件 .//testfile.csv 处理结束**********************************************结果文件 .//testfile.csv_result_unique.txt ***************************

  最终结果文件:

[root@wewewwew ~]# more testfile.csv_result_unique.txt A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ssA0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ssF250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ssF250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss

  时间比较赶,先这样实现吧。哪位亲们有好的办法请告诉我。

转载地址:http://uoxxa.baihongyu.com/

你可能感兴趣的文章
在Flex中动态设置icon属性
查看>>
采集音频和摄像头视频并实时H264编码及AAC编码
查看>>
3星|《三联生活周刊》2017年39期:英国皇家助产士学会于2017年5月悄悄修改了政策,不再鼓励孕妇自然分娩了...
查看>>
linux查看命令是由哪个软件包提供的
查看>>
高级Linux工程师常用软件清单
查看>>
堆排序算法
查看>>
folders.cgi占用系统大量资源
查看>>
路由器ospf动态路由配置
查看>>
zabbix监控安装与配置
查看>>
python 异常
查看>>
last_insert_id()获取mysql最后一条记录ID
查看>>
可执行程序找不到lib库地址的处理方法
查看>>
bash数组
查看>>
Richard M. Stallman 给《自由开源软件本地化》写的前言
查看>>
oracle数据库密码过期报错
查看>>
修改mysql数据库的默认编码方式 .
查看>>
zip
查看>>
How to recover from root.sh on 11.2 Grid Infrastructure Failed
查看>>
rhel6下安装配置Squid过程
查看>>
《树莓派开发实战(第2版)》——1.1 选择树莓派型号
查看>>