对文本的内容进行去重是一个 很常见的需求,excel也可以进行处理但是有数量的限制,而linux更适用于处理比较大的数据量的去重,更大的数据量去重则需要考虑使用spark等大数据框架进行运算。
本文记录 linux实现去重的操作命令
准备数据
示范:
vi barcode_list
# 输入内容
0001
0002
0003
0004
vi losebarcode.txt
# 输入内容
0002
0003
0005
快速去重命令
去掉文件barcode_list和losebarcode.txt都包含的编码,重复的编码
cat barcode_list losebarcode.txt |head
cat barcode_list losebarcode.txt |sort|uniq -c |sort -k 1 -n -r |head
cat barcode_list losebarcode.txt |sort|uniq -c |sort -k 1 -n -r |awk '{if($1==1){print $2}}'
cat barcode_list losebarcode.txt |sort|uniq -c |sort -k 1 -n -r |awk '{if($1==1){print $2}}' > x.txt
cat barcode_list |wc -l
cat x.txt |wc -l
主要的思路是 先合并两个文件,然后进行 排序,合并编码对数量进行统计,使用awk筛选出 数量为1的 写入到x.txt中,则 x.txt中为 不重复的 编码
输出如下:
[zzq@host3 ~]$ cat barcode_list losebarcode.txt |sort|uniq -c |sort -k 1 -n -r |awk '{if($1==1){print $2}}'
0005
0004
0001
[zzq@host3 ~]$
查看losebarcode.txt中有 barcode_list没有的
head barcode_list
grep -wFf barcode_list losebarcode.txt -v| head
grep -wFf barcode_list losebarcode.txt -v| wc -l
grep -wFf barcode_list losebarcode.txt -v > loseonly.txt
grep -w用于字符串精确匹配
grep -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
grep -F 或 --fixed-regexp : 将样式视为固定字符串的列表
以上三个参数 都是 处理格式问题,让每一行作为一个单位来精确对比
grep -v 或 --revert-match : 显示不包含匹配文本–不包含匹配字符串的所有行 barcode_list作为匹配文本 ,显示losebarcode.txt中不包含barcode_list的部分,就是 losebarcode.txt中有 barcode_list没有的
使用命令输出如下:
[zzq@host3 ~]$ grep -wFf barcode_list losebarcode.txt -v
0005
[zzq@host3 ~]$
去掉指定的两行数据
cat barcode_list |grep -v "0002" |grep -v "0003"
cat barcode_list |grep -v "0002" |grep -v "0003"|wc -l
cat barcode_list |grep -v "0002" |grep -v "0003" > xx.txt
输出如下:
[zzq@host3 ~]$ cat barcode_list |grep -v "0002" |grep -v "0003"
0001
0004
[zzq@host3 ~]$