0

0

如何去除文件重复行 uniq命令相邻去重实战

P粉602998670

P粉602998670

发布时间:2025-08-28 11:33:01

|

1029人浏览过

|

来源于php中文网

原创

要彻底去除文件中的重复行,必须先排序再使用uniq或直接使用sort -u,因为uniq只处理相邻的重复行。1. uniq命令仅能识别并处理连续重复的行,其原理是比较当前行与前一行,若相同则视为重复;2. 对于非相邻重复行,需先通过sort命令排序使相同内容相邻,再用uniq处理,常用组合为sort data.txt | uniq;3. 更简便的方式是使用sort -u,它一步完成排序和去重;4. 若无法排序或需更灵活控制,可使用awk '!a[$0]++'实现全局去重,该方法利用关联数组记录已见行;5. 在实际应用中,结合grep、awk、sed等工具可完成日志分析、配置文件清理等任务,如统计独立ip数或规范化黑名单;6. uniq常用选项包括-c(显示计数)、-d(仅显示重复行)、-u(仅显示唯一行),配合管道可实现复杂文本处理。因此,掌握uniq与相关命令的组合使用是高效进行命令行数据清洗的关键。

如何去除文件重复行 uniq命令相邻去重实战

文件去重,尤其是命令行下,

uniq
命令是把好手,但它有个特性需要特别注意:它只处理相邻的重复行。这意味着,如果你的文件里有两行内容相同,但它们中间隔着其他内容,
uniq
单独使用是无法去除它们的。要彻底去重,通常需要先用
sort
命令对文件内容进行排序,让所有相同的行都相邻,然后再通过
uniq
进行处理。

解决方案

uniq
命令的核心功能就是识别并删除输入中连续出现的重复行。它的基本用法很简单,但关键在于“连续”这个词。

假设我们有一个名为

data.txt
的文件,内容如下:

apple
banana
apple
orange
apple
banana

如果我们直接运行

uniq data.txt
,你会发现输出没有任何变化,因为没有相邻的重复行。

# 直接使用 uniq,不会有变化
uniq data.txt
# 输出:
# apple
# banana
# apple
# orange
# apple
# banana

要真正去除所有重复行,我们通常会结合

sort
命令。
sort
会将文件内容按字母顺序(默认)排序,这样所有相同的行就会被排到一起,形成相邻的重复。

# 先排序,再通过管道传递给 uniq
sort data.txt | uniq
# 输出:
# apple
# banana
# orange

这是一个非常经典的Unix哲学应用:通过管道将多个小工具组合起来,完成更复杂的任务。实际上,

sort
命令本身就有一个
-u
(或
--unique
)选项,可以直接实现排序并去重的功能,这在很多场景下会更方便。

# sort -u 是 sort | uniq 的快捷方式
sort -u data.txt
# 输出:
# apple
# banana
# orange

uniq
命令的工作原理到底是什么?它为什么只处理相邻行?

说起来,我记得我刚接触Linux那会儿,对

uniq
的理解也是走了弯路,总觉得它应该能“智能”地找出所有重复行。后来才明白,它的设计哲学其实非常简洁且高效:它仅仅是比较当前行和前一行。如果这两行完全相同,那么当前行就被认为是重复的,并被忽略掉(除非你用了特定的选项,比如
-d
来显示重复行)。

这种设计并非是功能上的缺陷,而是一种性能上的考量。想象一下,如果

uniq
需要记住文件中所有出现过的行,那对于一个几十GB甚至上百GB的大文件来说,它需要消耗巨大的内存来存储一个“已见行”的集合。而只比较相邻行,
uniq
只需要维护一个指向前一行的指针或者一个很小的缓冲区,内存占用极低,处理速度飞快,尤其是在处理已经排序好的数据流时,它的效率是无与伦比的。

所以,当你看到

uniq
只处理相邻行时,不要觉得它“不够智能”,这正是它设计上的精妙之处:专注于高效处理特定类型的数据(已排序或本身就相邻重复的数据)。这种“小而精”的工具组合起来,就能完成复杂任务,这正是Unix/Linux命令行工具的魅力所在。

遇到非相邻重复行,除了
sort | uniq
还有哪些进阶处理方式?

虽然

sort -u
是处理非相邻重复行最常用且高效的方案,但在某些特定场景下,我们可能需要更灵活的工具。

Removal.AI
Removal.AI

AI移出图片背景工具

下载

一个非常强大的替代方案是使用

awk
命令。
awk
作为一个文本处理工具,能够基于模式匹配和字段处理来操作文本。利用
awk
的关联数组(associative array)特性,我们可以轻松实现去重,甚至可以根据行的某个特定字段来去重,而不仅仅是整行。

例如,要去除文件中所有重复的行,无论它们是否相邻,可以使用以下

awk
命令:

awk '!a[$0]++' data.txt

这条命令的解释是:

  • !a[$0]++
    :这是
    awk
    的一个经典用法。
    • $0
      代表当前行的全部内容。
    • a
      是一个关联数组,
      a[$0]
      会以当前行的内容作为键。
    • a[$0]++
      的意思是,访问
      a[$0]
      并将其值加1。
    • !
      是逻辑非操作符。
    • a[$0]
      第一次被访问时,它的值是0(或未定义,在
      awk
      中会被视为0)。
      0++
      仍然是0,
      !0
      结果为真(true)。当条件为真时,
      awk
      会执行默认动作,即打印当前行。
    • 当同一行再次出现时,
      a[$0]
      的值已经大于0(例如1)。
      1++
      仍然是1,
      !1
      结果为假(false)。当条件为假时,
      awk
      不会执行默认动作,即不打印当前行。

这样,

awk
就通过维护一个“已见行”的集合(在
a
数组中)来实现了全局去重。这对于那些无法或不适合排序的大文件,或者需要根据复杂逻辑去重的情况,提供了极大的灵活性。

如何在实际开发中高效利用
uniq
命令进行数据清洗?

在日常的开发和运维工作中,

uniq
命令及其组合拳在数据清洗、日志分析和报告生成方面有着不可替代的地位。

  1. 日志分析中的重复事件统计: 假设你有一个服务器访问日志

    access.log
    ,里面记录了大量的IP地址。你可能想知道有多少个独立的IP访问了你的服务,或者哪些错误消息出现了多少次。

    # 统计独立访问IP数量
    awk '{print $1}' access.log | sort -u | wc -l
    
    # 统计不同错误消息的出现次数
    grep "ERROR" app.log | sort | uniq -c | sort -nr
    # 解释:
    # grep "ERROR":筛选出所有包含 "ERROR" 的行。
    # sort:对错误行进行排序,使相同的错误消息相邻。
    # uniq -c:统计相邻重复行的次数,并在每行前面加上计数。
    # sort -nr:再次排序,但这次是按数字(n)逆序(r)排列,这样出现次数最多的错误就会排在前面。

    这种组合方式能让你快速洞察日志中的模式和异常。

  2. 配置文件或列表的去重与规范化: 有时你需要维护一个列表文件,比如白名单、黑名单或者某个配置项的列表,确保其中没有重复项。

    # 清理并规范化一个域名黑名单文件
    # 假设 blacklist.txt 中可能含有空行、重复域名,且大小写不一致
    cat blacklist.txt | sed '/^\s*$/d' | tr '[:upper:]' '[:lower:]' | sort -u > cleaned_blacklist.txt
    # 解释:
    # sed '/^\s*$/d':删除空行(包括只包含空白字符的行)。
    # tr '[:upper:]' '[:lower:]':将所有大写字母转换为小写,实现大小写不敏感去重。
    # sort -u:排序并去重。
    # > cleaned_blacklist.txt:将结果保存到新文件。

    这种流程可以确保你的配置列表始终是干净且唯一的。

  3. 数据预处理阶段: 在将数据导入数据库或进行进一步分析之前,去除重复记录是至关重要的一步。无论是CSV文件还是其他文本格式,

    sort -u
    都是一个快速有效的预处理工具。

    # 去除CSV文件中的重复行(假设每行都是一条记录)
    sort -u input.csv > unique_records.csv

uniq
命令的一些常用选项:

  • -c
    :在每行前面加上该行在输入中出现的次数。
  • -d
    :只显示重复的行(即至少出现两次的行)。
  • -u
    :只显示不重复的行(即只出现一次的行)。

结合这些选项,

uniq
不仅仅是去重,还能帮助我们进行更细致的数据分析和筛选。熟练掌握
uniq
及其与
sort
grep
awk
等命令的组合使用,能极大地提升你在命令行下处理文本数据的效率。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

385

2023.09.04

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

344

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2074

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

322

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

408

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

391

2023.10.16

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.1万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号