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

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

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

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

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

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

  测试数据:

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

  shell脚本:

if [ "$#" != "2" ]; thenecho "Usage: 参数1:文件路径,参数2:文件名。"exit
fi
#源文件所在目录
filepath=$1
#源文件绝对路径
orgfile=$filepath"/"$2
#合并字段后的临时文件
#mergerfile="$orgfile"_merge.txt
#排序后的临时文件
sortfile="$orgfile"_sort.txt
#最终结果文件
result_unique="$orgfile"_result_unique.txt
echo "">$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 >$sortfile
sort -t $"," -k 1,2 $orgfile >$sortfile
echo "文件排序 end..."printf "***********文件比较 start**************************\n"
echo "while read line <$sortfile"
cnt=0
#首行
firstline=""
#尾行
lastline=""
#上一次比较的key
lastKey=""
#文件行数
linecount=`sed -n '$=' $sortfile`
i=1
echo "linecount=========>>>>>>>$linecount"
while read line || [[ -n "$line" ]];
doecho $line;#合并需要比较的字段compare=`echo "$line"|awk -F ',' '{print $1$3$4}'`echo "compare=====$compare"#判断字符串是否相等if [ "$i" != "$linecount" -a "$lastKey" = "$compare" ];thenecho "[ = ]"cnt=$(expr $cnt + 1)lastline="$line"else#首次进来if [ "$firstline" = "" ];thenfirstline=$linecnt=1#echo "$firstline" >> $result_uniquefi#echo "----$i---------------->>>>>>>>>>>$cnt"if [ $cnt -gt 1 -o "$i" == "$linecount" ];thenecho "----$i---------------->>>>>>>>>>>$cnt"if [ "$i" != "$linecount" -a "$lastline" != "" ];thenecho "$lastline" >> $result_uniqueecho "$line" >> $result_uniquefi# 最后一行的特殊处理if [ "$i" == "$linecount" ];thenecho "================last line==================="echo "$line" >> $result_uniquefifirstline="$line"lastline="$line"cnt=1elif [ $cnt -eq 1 ];thenfirstline=$linelastline="$line"cnt=1echo "$lastline" >> $result_uniquefifi# 对比keylastKey="$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.txt
linecount=========>>>>>>>6
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
compare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
compare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0
[ = ]
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
----3---------------->>>>>>>>>>>2
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
[ = ]
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
[ = ]
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
compare=====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,ss
A0223EE1IDJDJ2938X39284BE,20080304041155 ,OQQQQ54,876F0,88888120,727271202,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss
F250A4FFIDJDJ2938X39252E7,20080304041348 ,OQQQQB8,8769E,88888626,727218105,ss

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

来源:http://www.cnblogs.com/rwxwsblog/p/5638393.html

如何使用shell脚本快速排序和去重文件数据相关推荐

  1. shell脚本上传文件到ftp服务器,shell脚本实现FTP自动上传文件

    -----多个文件----- #!/bin/bash ftp -n< open 172.20.10.242 user logftp logftp binary cd /data/ftp/pcid ...

  2. Shell脚本对Linux进行文件校验

    Shell脚本对Linux进行文件校验 一.需求 有客户等保需求对文件一致性进行校验,想到利用md5sum工具,因此写脚本来对文件进行自定义扫描,后期可以利用其进行校验,快速校验文件发现变更的文件,一 ...

  3. shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有! -e这又是什么意思呢?

    shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有"! -e"这又是什么意思呢? -e filename 如果 filename存在,则为真 -d filename ...

  4. Tips--利用shell脚本批量提取txt文件中任意字段

    利用shell脚本批量提取txt文件中任意字段 前言 0. 一个例子 1. cat命令 2. '|'符号与'>'符号 3. grep命令 4. awk命令 前言 对于测试中出现的log,我们经常 ...

  5. linux脚本中如何读取文件,如何在Shell脚本中逐行读取文件

    原标题:如何在Shell脚本中逐行读取文件 在这里,我们学习Shell脚本中的3种方法来逐行读取文件. 方法一.使用输入重定向 逐行读取文件的最简单方法是在while循环中使用输入重定向. 为了演示, ...

  6. php调用shell执行scp,使用shell脚本自动执行scp文件传输

    使用shell脚本自动执行scp文件传输 我的unix系统上的目录中有n个文件. 有没有办法编写一个shellcript,将所有这些文件通过scp传输到指定的远程系统. 我将在脚本中指定密码,这样我就 ...

  7. shell脚本:遍历指定文件夹下.jar后缀的文件,并备份到目标文件夹

    shell脚本:遍历指定文件夹下.jar后缀的文件,并备份到目标文件夹 批量备份源文件夹下的所有jar包 并用原名+日期时间重命名 过程如下: 创建一个sh文件: vim test.sh 按 i 进入 ...

  8. php批量替换文件内容,Shell脚本实现批量替换文件内容

    Shell脚本实现批量替换文件内容 今天同事发现内部服务器的硬盘空间不够了,上面有很多备份,我又不能删除,重新找了个320g的硬盘挂载了上,想以后shell脚本下的备份都转移到新硬盘上,给老硬盘腾出空 ...

  9. 在Linux中通过shell脚本向oracle数据库插入数据

    通过shell脚本向oracle数据库插入数据 思路 实现 shell脚本 数据文件 测试 思路 如何通过shell脚本更新数据库数据?要解决这个问题,首先,我们需要在脑中回忆一下我们通常是如何更新数 ...

最新文章

  1. 增量式爬虫与分布式爬虫
  2. IntelliJ IDEA 连接数据库 详细过程
  3. PyTorch官方教程中文版:入门强化教程代码学习
  4. 在U盘上安装Linux系统解决方案
  5. Docker安装elasticsearch-head监控ES步骤 - gmijie的专栏 - CSDN博客
  6. GitHub CEO 回应源代码泄露:没有黑客!没有被入侵!
  7. 中公教育python培训讲师面试题_中公教育面试经验
  8. 找电影最强攻略,最全资源站
  9. Django菜鸟入门笔记(1)
  10. 弘辽科技:如何写出自带流量的标题
  11. android qq底部菜单栏,怎么关闭手机QQ底部导航栏的“看点”?
  12. android安全加固方案,android安全加固技术
  13. 微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)...
  14. Python学习干货,如何用Python进行数据分析?
  15. 北理计算机学院2005年机试真题
  16. TypeScript基础教程
  17. 微信小程序 ssm装潢装修订单设计案例app
  18. 色拉英语第3集第2幕: what do yo do ?
  19. 百度地图对应天气城市代码
  20. VPU加速引擎 是什么意思?

热门文章

  1. c++ 获取linux系统信息_linux系统c程序移植
  2. 9_InfluxDB常用函数(二)选择类函数(TOP() BOTTOM() FIRST() LAST() MAX() MIN() PERCENTILE())
  3. Elasticsearch之核心元数据:_index,_type,_id [学习笔记]
  4. 8.3控制质量(后续不断完善)
  5. 1.使用C++封装一个链表类LinkList
  6. 检索数据_2_从表中查询部分行
  7. 如何建立java ssm工程_如何搭建一个ssm项目
  8. PhotoShop常用的功能汇总
  9. 模式的秘密-观察者模式(二)
  10. JavaScript历史状态管理