Linux中uniq去重以及对两个文件取交集,并集,差集

本文详述了Linux命令uniq的使用,包括如何进行数据去重、统计重复次数、忽略字段等,并结合sort实现文件去重、交集、并集和差集操作。通过实例展示了uniq与sort配合的多种用法,适合数据处理和文件操作。
摘要由CSDN通过智能技术生成

uniq

前言

  • 很多时候我们需要对数据去重,不管是少量数据还是大量数据,写代码进行去重终究没有使用系统功能直接操作文件方便,所以本文就介绍了一些关于uniq的使用方法

  • uniq单独使用

  • uniq配合sort实现文件去重

  • uniq配合sort实现文件之间的交集,并集,和差集

uniq单独使用

用法 :uniq [选项]… [文件]

注意

  • uniq去重时需要重复数据是相邻的,也就是说需要配合sort排序后去重,不相邻的重复数据是无法用uniq去重的

  • uniq去重后输出结果是直接输出到终端的,不对源文件进行去重删除,所以如果是对文件去重需要将用>将去重后的数据输入到新的文件中。

参数详解

  • c, --count 会显示该条重复数据重复了几次,数字在重复数据前

  • d, --repeated 只输出重复的行(配合-c使用)

  • D, --all-repeated 只输出重复的行,不过有几行输出几行,类似于吧重复的数据都拿出来然后排列后展示(这个就没法配合-c使用了)

  • f, --skip-fields=N 以行为方向,忽略该行的N个字符,与下一行比较,同时下面的行也是忽略该行的N个字符的

  • i, --ignore-case //不区分大小写

  • s, --skip-chars=N //根-f有点像,不过-s是忽略,后面多少个字符 -s 5就忽略后面5个字符

  • u, --unique //去除重复的后,全部显示出来,根mysql的distinct功能上有点像

  • z, --zero-terminated end lines with 0 byte, not newline

  • w, --check-chars=N //对每行第N 个字符以后的内容不作对照

  • 借用参考资料中的例子数据

"""
this is a test  
this is a test  
i am tank  
i love tank  
i love tank  
this is a test  
whom have a try  
WhoM have a try  
you  have a try  
i want to abroad  
those are good men  
we are good men
"""

当直接使用时

图片

  • 1 直接输出到命令窗口

  • 2 不相邻的重复数据是不会去重的,所以要搭配sort使用

搭配参数 -c

图片

  • 此时只是统计了数据出现次数
搭配参数 -d
搭配参数 -d -c
搭配参数 -D

图片

搭配参数 -f

图片

搭配参数 -i / -u

图片图片

-s / -w
  • -sb与-w都有-f比较容易理解,都是忽略部分字符去重不再试验

uniq配合sort实现文件去重

  • 相信上面其中的一个例子,使用uniq与sort搭配去重已经可以让人举一反三,所以此处不多赘述

  • 关于sort的参数详情可以参考本人另一个博客,搜索sort的用法(简写,不是特别详细,不要有很高的期望,毕竟sort直接用不加参数的时候最多,搭配uniq使用,重点也不是sort)

uniq配合sort实现文件之间的交集,并集,和差集

  • 如果上面两个方法已经掌握,该方法就是花活儿了,同上依旧略写
交集

sort a.txt b.txt | uniq -d

并集

sort a.txt b.txt | uniq

差集

a.txt-b.txt:

sort a.txt b.txt b.txt | uniq -u

b.txt - a.txt:

sort b.txt a.txt a.txt | uniq -u

  • 可能这一部分稍微抽象那么一丢丢,不过稍加理解就ok的

参考资料
1 本人sort总结:https://blog.csdn.net/Lian_Ge_Blog/article/details/123524961?spm=1001.2014.3001.5501
2 linux命令(12)uniq去重 - 细雨微光 - 博客园 (cnblogs.com)
3 Linux 两个文件求交集、并集、差集 - molong1208 - 博客园 (cnblogs.com)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Linux,没有直接的内置命令用于执行两个集合之间的差集操作,即返回所有在第一个集合但不在第二个集合的元素。但是,你可以使用一些组合命令或者外部工具来实现这个功能。最常用的工具有`comm`(交集差集)、`awk`或`cut`等。 以下是几个常用方法: 1. **Using `comm` command with `-23` option**: 这个命令比较两个文件的内容,并显示只有第一个文件存在的行。 ```sh comm -23 file1.txt file2.txt > diff.txt ``` `file1.txt` 和 `file2.txt` 分别是你想要做差集两个文件,结果将保存到`diff.txt`。 2. **Using `awk` and `uniq`**: ```sh awk 'FNR==NR {a[$0];next} !($0 in a)' file2.txt < file1.txt ``` 把较小的那个文件作为输入(`< file1.txt`),较大的那个文件的内容存储在一个数组`a`,然后逐行读另一个文件,查找不在`a`的行。 3. **Using `cut` and `sort`** (假设两个文件按同一字段分隔): ```sh cut -d ',' -f 1 file1.txt | sort | uniq -u > diff.txt ``` 首先切割两个文件的第一列(或其他指定列),然后对第一列排序并找出唯一值,即差集。 注意,以上示例假设你的数据是以某种形式(如逗号分隔或行分隔)组织的。如果你的数据是复杂的数据结构(如JSON或XML),可能需要更复杂的解析或转换步骤。 **相关问题--:** 1. 在Linux,如何使用`comm`命令计算三个文件差集? 2. 如果我想在命令行处理非文本格式的数据,如CSV,上述方法还有效吗? 3. 是否存在其他更适合处理大数据量的差集操作工具?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矮人三等

秀儿,是你吗秀儿?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值