试想一下,如果有10G数据,或者更多;怎么才能够快速地去重呢?你会说将数据导入到数据库(mysql等)进行去重,或者用java写个程序进行去重,或者用Hadoop进行处理。如果是大量的数据要写入数据库也不是一件容易的事情,首先你需要开发一个程序将数据写入数据库,然后再用数据库的select distinct或者group by进行去重。如果是一次性的工作,这种方式显得就比较笨拙了。那么有没有更好的办法呢?下面记录一下我是怎么从10G数据里面迅速去重的。这里采用shell脚本的方式进行处理。

说明

  • 这10G数据分布在七八个文件中

  • 文件编码格式为gb2312

  • 数据格式:

"ID","已采","已发","内容","PageUrl"
"1","1","1","====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||","http://www.xxx.com/"
"1","1","1","====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||","http://www.xxx.com/"
"1","1","1","====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||","http://www.xxx.com/"

数据格式说明:

  • 上面是3行数据
  • 每行都是5个field
  • 每个field间用“,”隔开
  • 而需要的内容在第4个field(也就是内容这个field)
  • 内容field间会员用“ ==================== ”隔开
    要达到的效果:将会员信息提取出来并去重

实现思路和测试

1.由于文件编码是gb2312编码,所以第一步是将文件编码转成utf-8编码

iconv -c -f gb2312 -t utf-8 test.txt > test2.txt

这里我们用linux系统自带的iconv命令进行转换,-c的意思是将无法识别的字符直接忽略掉

2、获取会员信息,由于是第4个field,因而我们只需要获取第四个field即可,这里采用awk命令获取

awk 'BEGIN{ FS=",";}{ print $4 }' test2.txt > test_menber.txt

awk指定分隔符的方法为FS=”,”,运行后的结果如下

vi test_menber.txt
"内容"
"====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"
"====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"
"====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||====================会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"

这里已经获取到了会员的信息;但是一行有多个会员的信息,而个数又是不固定的。因此下面是想办法一行显示一个会员

3、一行显示一个会员

由于会员信息间通过“====================”分割,要实现一行显示一个会员只需要将“====================”替换成换行即可。

sed -i "s/====================/\n/g" test_menber.txt

查看test_menber.txt的内容

vi test_menber.txt 1 "内容"2 "3 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||4 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||5 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||6 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"7 "8 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||9 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||10 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||11 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"12 "13 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||14 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||15 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||16 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"

4、替换掉其他字符“””、空行和“|||”

#将“"”替换成空字符串
sed -i "s/\"//g" test_menber.txt
#删除空行
sed -i '/^$/d' test_menber.txt
#将分隔符|||换成@
sed -i "s/|||/@/g" test_menber.txt

5、根据会员名去重

sort -t $"@" -k 1,1 -su test_menber.txt >test_uniq.txt

-t可以指定分隔符,-k指定排序的field, -su表示稳定排序并去重

查看结果

[root@bogon yichen]# more test_uniq.txt 
会员名:鬼脚七@@@@@@会员等级:军长第5年@姓名:张三 @
内容

思路和测试完成了,但是文件比较多,一个个文件去处理也比较麻烦。因而写个脚本去处理即可

脚本批量处理

1、转换文件编码

[root@bogon yichen]# vi iconv_shell.sh
#!/bin/sh
if [ "$#" != "2" ]; then
echo "Usage: `basename $0` dir filter"
exit
fi
echo $1
for file in `find $1 -name "$2"`; do
echo "$file"
iconv -c -f gb2312 -t utf8 $file > ${file}_utf8

调用./iconv_shell.sh 目录 文件通配符,例如:

./iconv_shell.sh ./ "*txt"

此时生成的文件后缀为:.txt_utf8

2、提取会员信息

vi awk_filler.sh
#!/bin/sh
if [ "$#" != "2" ]; then
echo "Usage: `basename $0` dir filter"
exit
fi
for file in `find $1 -name "$2"`; do
echo "$file"
awk 'BEGIN{ FS=",";}{ print $4 }' $file > ${file}_menber
done

调用

./awk_filler.sh ./ "*.txt_utf8"

此时生成的文件后缀为:.txt_utf8 _menber

3、替换“ ==================== ”、“””、“|||”和换行

vi sed_shell.sh
#!/bin/sh
if [ "$#" != "2" ]; then
echo "Usage: `basename $0` dir filter"
exit
fi
for file in `find $1 -name "$2"`; do
echo "$file"
sed -i "s/====================/\n/g; s/\"//g; /^$/d; s/|||/@/g" $file
donefor file in `find $1 -name "$2"`; do
echo "$file"
sed -i "/^$/d" $file
done

sed支持多表达式:sed “表达式1;表达式2” filename,注意表达式之间用“;”号隔开。

调用:

sh ./sed_shell.sh ./ "*.txt_utf8_menber"

替换后的文件后缀仍为txt_utf8_menber

4、去重

vi uniq_shell.sh
#!/bin/sh
if [ "$#" != "2" ]; then
echo "Usage: `basename $0` dir filter"
exit
fi
for file in `find $1 -name "$2"`; do
echo "$file"
sort -t $"@" -k 1,1 -su ${file} >${file}_uniq
done

调用:

sh ./uniq_shell.sh ./ "*.txt_utf8_menber"

最后生成去重后的文件后缀为txt_utf8_menber_uniq

其实也可以放在一个shell脚本里面完成,这里就不再阐述了。想想看10G的文件用几个简单的命令就完成了去重,可见linux的强大。所以说学几个简单的linux命令还是很有必要的,这样可以大大地降低你的工作量,提高工作的效率。

10G数据不用框架快速去重相关推荐

  1. 用几条shell命令快速去重10G数据

    试想一下,如果有10G数据,或者更多:怎么才能够快速地去重呢?你会说将数据导入到数据库(mysql等)进行去重,或者用java写个程序进行去重,或者用Hadoop进行处理.如果是大量的数据要写入数据库 ...

  2. c语言字符串去重用指针,用几条shell命令快速去重10G数据

    试想一下,如果有10G数据,或者更多:怎么才能够快速地去重呢?你会说将数据导入到数据库(mysql等)进行去重,或者用java写个程序进行去重,或者用Hadoop进行处理.如果是大量的数据要写入数据库 ...

  3. 一千万条数据去重_Mysql千万级数据快速去重

    问题:card 表的 card_number 字段忘记加唯一约束,造成大量数据重复,需要去重. 1 测试数据准备 创建表1 2 3 4 5 6CREATE TABLE `card` ( `card_i ...

  4. 全面认识当前市面99%的大数据技术框架(附:各大厂大数据技术应用文章)

    目录 大数据领域分析 系统平台 集群管理与监控 文件系统 资源调度 协调框架 数据存储 数据处理 数据查询和分析 数据收集 消息系统 任务调度 数据治理 数据可视化 云平台 大数据必知点 大厂应用实践 ...

  5. 使用 CodeIgniter 框架快速开发 PHP 应用(二)

    使用 CodeIgniter 框架快速开发 PHP 应用(二) 原文:使用 CodeIgniter 框架快速开发 PHP 应用(二) 二分钟: 建立一个 CodeIgniter 网站 用CI建一个网站 ...

  6. 使用 CodeIgniter 框架快速开发 PHP 应用(五)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(五) 简化 HTML 页面和表格设计 这一章介绍了又一个节约你的时间而且使你的代码更具安全性和逻辑性的领域. 第一,我们将会介绍创建视图 ...

  7. php框架和不用框架_如何选择一个PHP框架

    php框架和不用框架 PHP是世界上最受欢迎的编程语言之一,而最近的PHP 7版本使这种服务器端编程语言比以往任何时候都更好,更稳定. PHP被广泛用于大型项目中. 例如,Facebook利用PHP来 ...

  8. 使用 CodeIgniter 框架快速开发 PHP 应用(一)

    使用 CodeIgniter 框架快速开发 PHP 应用(一) 原文:使用 CodeIgniter 框架快速开发 PHP 应用(一) 对 CodeIgniter 的介绍 大多数PHPer都想写出运行状 ...

  9. java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】

    第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...

最新文章

  1. 【多标签文本分类】Initializing neural networks for hierarchical multi-label text classification
  2. 第十五届全国大学生智能车竞赛百度深度学习车模
  3. python opencv旋转
  4. 采购订单模板_电子信息制造业解决方案,电子工业采购监管、管理、降本可控化...
  5. Oracle在线重定义
  6. SQLServer制作一个包含三个表的视图
  7. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)
  8. 学习xss的一些记录(一)
  9. assoc_Ruby assoc()函数
  10. Spring框架整合MyBatis框架
  11. MPEG4标准中的Advanced Simple Profile(ASP)完整的说明-01-02章
  12. 基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现
  13. linux更改文件系统格式,只安装Linux系统,把硬盘全部格式化成Linux文件系统
  14. 会员运营五大难题与破解之道
  15. 树莓派安装Jupyter Notebook实现网页编程
  16. VML实例及两个网站
  17. Ubuntu下安装PCL1.12.1点云库经验分享
  18. 力扣 2303. 计算应缴税款总额
  19. Records of Reinfocement Learning Experiments
  20. 【医疗健康项目】传智健康项目(三)

热门文章

  1. 外贸如何找客户邮箱?
  2. Xmanager5 Passive 图形化界面安装时,界面出来之后鼠标点不了,鼠标点击无反应
  3. 4.PMAC下位机-PMAC安装参数设置
  4. 解决maya导出FBX出现问题。
  5. Logback 学习笔记
  6. 1.ffmpge的移植
  7. 我是CTO,我为CEO吹过的牛逼买单!
  8. 【mysql】图文展示Mysql锁
  9. OpenCv 在Win7台式机上的摄像头无法拍照
  10. 使用numpy计算准确率