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

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

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

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

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

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

  测试数据:

F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
A0223EE1IDJDJ2938X39284BE, ,OQQQQ54,876F0,,,ss
A0223EE1IDJDJ2938X39284BE, ,OQQQQ54,876F0,,,ss

  shell脚本:

if [ "$#" != "" ]; then
echo "Usage: 参数1:文件路径,参数2:文件名。"
exit
fi
#源文件所在目录
filepath=$
#源文件绝对路径
orgfile=$filepath"/"$
#合并字段后的临时文件
#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 , -k , $mergerfile >$sortfile
sort -t $"," -k , $orgfile >$sortfile
echo "文件排序 end..." printf "***********文件比较 start**************************\n"
echo "while read line <$sortfile"
cnt=
#首行
firstline=""
#尾行
lastline=""
#上一次比较的key
lastKey=""
#文件行数
linecount=`sed -n '$=' $sortfile`
i=
echo "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 + )
lastline="$line"
else
#首次进来
if [ "$firstline" = "" ];then
firstline=$line
cnt=
#echo "$firstline" >> $result_unique
fi
#echo "----$i---------------->>>>>>>>>>>$cnt"
if [ $cnt -gt -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=
elif [ $cnt -eq ];then
firstline=$line
lastline="$line"
cnt=
echo "$lastline" >> $result_unique
fi
fi
# 对比key
lastKey="$compare"
let i++
done <$sortfile echo "*******************文件 $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=========>>>>>>>
A0223EE1IDJDJ2938X39284BE, ,OQQQQ54,876F0,,,ss
compare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0
A0223EE1IDJDJ2938X39284BE, ,OQQQQ54,876F0,,,ss
compare=====A0223EE1IDJDJ2938X39284BEOQQQQ54876F0
[ = ]
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
-------------------->>>>>>>>>>>
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
[ = ]
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
[ = ]
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
compare=====F250A4FFIDJDJ2938X39252E7OQQQQB88769E
-------------------->>>>>>>>>>>
================last line===================
*******************文件 .//testfile.csv 处理结束***************************
*******************结果文件 .//testfile.csv_result_unique.txt ***************************

  最终结果文件:

[root@wewewwew ~]# more testfile.csv_result_unique.txt 

A0223EE1IDJDJ2938X39284BE, ,OQQQQ54,876F0,,,ss
A0223EE1IDJDJ2938X39284BE, ,OQQQQ54,876F0,,,ss
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss
F250A4FFIDJDJ2938X39252E7, ,OQQQQB8,8769E,,,ss

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

如何使用shell脚本快速排序和去重文件数据的更多相关文章

  1. Centos7下crontab+shell脚本定期自动删除文件

    问题描述: 最近有个需求,就是rsync每次同步的数据量很多,但是需要保留的数据库bak文件 保留7天就够了,所以需要自动清理文件夹内的bak文件 解决方案: 利用shell脚本来定期删除文件夹内的任 ...

  2. Shell脚本使用汇总整理——文件夹及子文件备份脚本

    Shell脚本使用汇总整理——文件夹及子文件备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html ...

  3. shell脚本实现读取一个文件中的某一列,并进行循环处理

    shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...

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

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

  5. [ Shell ] 通过 Shell 脚本导出 GDSII/OASIS 文件

    https://www.cnblogs.com/yeungchie/ 常见的集成电路版图数据库文件格式有 GDSII 和 OASIS,virtuoso 提供了下面两个工具用来在 Shell 中导出版图 ...

  6. Shell脚本 | 抓取log文件

    在安卓应用的测试过程中,遇到 Crash 或者 ANR 后,想必大家都会通过 adb logcat 命令来抓取日志定位问题.如果直接使用 logcat 命令的话,默认抓取出的 log 文件包含安卓运行 ...

  7. shell脚本:变量,文件判断,逻辑运算等纪要

    shell脚本中的变量定义,引用各有不同的方式,除此之外,很常用的有文件属性判断,逻辑运算,数值运算等,下面记录一下它们的属性作用 变量 shell变量的定义分为两种:一种是直接赋值定义,另一种是嵌套 ...

  8. ubuntu 用shell脚本实现将当前文件夹下全部文件夹中的某一类文件复制到同一文件夹下

    当前文件夹下有一些文件和文件夹,当中每一个文件夹里都有若干.txt文件. 如今要求在当前文件夹创建一个新文件夹all,且将那些文件夹全部.txt文件 都复制到文件夹all.在ubuntu12.04的s ...

  9. shell脚本0——”一切皆文件“, 认识Shell

    一.”一切皆文件“与“管道” 1)管道:grep foo /path/to/file | grep -n -k 3 | more 实际过程与我们直观认为的相反,最好通过实际过程理解.首先运行的是mor ...

随机推荐

  1. NSUserDefaults standardUserDefaults的使用

    本地存储数据简单的说有三种方式:数据库.NSUserDefaults和文件. NSUserDefaults用于存储数据量小的数据,例如用户配置.并不是所有的东西都能往里放的,只支持:NSString, ...

  2. Object&&String学习

    Object类 列表项 String类 常用方法 构造方法 public String() public String(byte[] bytes) public String(byte[]bytes, ...

  3. 给select添加自定义值和选项

    添加选项: document.getElementById("id_select").options.add(new Option("name", " ...

  4. 几个主流java连接池

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  5. 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”

    接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...

  6. SQL按指定文字顺序进行排序(中文或数字等)

    在有些情况下我们需要按指定顺序输出数据,比如选择了ID in(3,1,2,5,4)我们希望按这个3,1,2,5,4的顺序输出,这样只使用order by ID是无法实现的, 但是我们可以使用order ...

  7. Js控制iFrame切换加载网址

    <html> <head> <title>Js控制 iFrame 切换加载网址</title> </head> <body> & ...

  8. HNU 12886 Cracking the Safe(暴力枚举)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274 解题报告:输入4个数 ...

  9. 3d回顾

    手把手教你玩转 CSS3 3D 技术   要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上 ...

  10. 剑指Offer 二叉树中和为某一值的路径(dfs)

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.     思路: 递归,然后深搜,因为题目定义的, ...