Linux awk去重

转载地址:https://m.baidu.com/from=844b/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401321_2001%2Cta%40utouch_1_8.1_3_600/baiduid=7158631D9CE591C840AF47EAC0FB86F6/w=0_10_Awk+%E5%8E%BB%E9%87%8D%E8%AF%A6%E8%A7%A3/t=wap/l=3/tc?ref=www_utouch&lid=5474024596868729692&order=8&vit=osres&tj=www_normal_8_0_10_title&m=8&srd=1&dict=32&title=awk%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B%3A%E9%80%9A%E8%BF%87awk%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E8%A1%8CCodingAnts&sec=7686&di=95c1c4843b082c2d&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yJVBiu-o5_kgeSlItdnJ7HNRHSGGkLagTCcsx5EwnSf07Uz7qQ3bfdtgix96juwuK3utgjKW2RFtdA-4tO4VCkm64u5l3t8uK



awk使用案例:通过awk去除重复行


  重复的数据总是让人各种不爽,占用空间、看起来费劲等等,今天就介绍一个通过awk去除文件中重复数据的办法,awk默认是一行行来处理数据的,那我们就重点说说如何通过awk去除文件中的重复行。

  首先准备一个文本文件,随便写个文件,包含重复行数据的即可,或者你可以参考我这里的文件:

CodingAnts@ubuntu:~/awk$ cat dup
hello world
awk
coding ants
hello world
awk
hello world
awk
coding ants
coding ants

  共有9行,后面6行都是重复的前面的几行,最终的效果应该是只显示上面重点显示的那几行,先来看看效果:

CodingAnts@ubuntu:~/awk$ awk '!a[$0]++' dup
hello world
awk
coding ants

  在《awk程序指令模型》中介绍了awk的程序指令由模式和操作组成,即Pattern { Action }的形式,如果省略Action,则默认执行 print $0 的操作。

  实现去除重复功能的就是这里的Pattern:

!a[$0]++

  在awk中,对于未初始化的数组变量,在进行数值运算的时候,会赋予初值0,因此a[$0]=0,++运算符的特性是先取值,后加1,因此Pattern等价于

!0

  而0为假,!为取反,因此整个Pattern最后的结果为1,相当于if(1),Pattern匹配成功,输出当前记录,对于dup文件,前3条记录的处理方式都是如此。

  当读取第4行数据“hello world”的时候,a[$0]=1,取反后的结果为0,即Pattern为0,Pattern匹配失败,因此不输出这条记录,后续的数据以此类推,最终成功实现去除文件中的重复行。


<think>嗯,用户让我介绍一下Linux文件的方法。我需要先回想一下常见的工具有哪些,以及它们的用法。首先,像uniq这样的命令,不过记得它通常处理的是排序后的文本行,可能用户需要先排序。然后,可能有更高效的工具比如sort加上uniq的组合。还有像fdupes这样的专门工具,可以查找并删除复文件。另外,可能涉及到基于哈希值的比较,比如md5sum或者sha1sum来检查文件内容是否相同。 用户可能是系统管理员或者开发者,需要清理复文件节省空间,或者处理日志文件。要分情况讨论:如果是文本行级别的,用sort和uniq;如果是文件级别的,用fdupes或者自己写脚本比较哈希值。还要注意,处理文件删除时要谨慎,避免误删要文件。可能还需要提到硬链接的方法来节省空间,比如使用rmlint或者fslint这样的工具。另外,如果是在处理大文件或者大量文件,性能也是一个考虑因素,可能需要更高效的工具或者方法。 需要确保回答结构清晰,分点说明不同的场景和对应的工具,给出具体的命令示例,同时提醒注意事项,比如备份数据。可能用户对Linux不是特别熟悉,所以命令示例要具体,参数解释清楚。比如,用fdupes -r目录递归查找,然后删除时的确认步骤。或者用find结合md5sum的方法,处理少量文件的情况。还要提到为什么哈希比较可靠,因为不同文件名但内容相同的情况。 有没有遗漏的工具?比如jdupes,它是fdupes的一个分支,可能效率更高。或者使用rsync的--ignore-existing选项?不过可能不太相关。还有,可能用户需要的是实时,这时候可以考虑文件系统的特性,比如Btrfs的复数据删除功能,但可能比较复杂,适合高级用户。 总结下来,回答的结构应该是先介绍的两种主要场景:行级和文件级。然后分别介绍对应的工具和命令,给出例子。接着提到注意事项,比如备份和谨慎删除。最后可能有其他工具或方法的补充,比如硬链接或文件系统支持。确保语言简洁明了,避免技术术语过多,但必要的命令要准确。</think>在 Linux 系统中,文件通常分为两种场景:**文本内容行级**和**文件级**。以下是常用方法和工具介绍: --- ### 一、文本内容行级(针对单文件内容) 适用于日志、文本文件中的复行清理。 #### 1. `sort` + `uniq` 组合 - **原理**:先排序相邻复行,再用 `uniq` 。 - **命令示例**: ```bash sort file.txt | uniq > new_file.txt # 直接 sort -u file.txt > new_file.txt # 更高效的写法(一步完成排序) ``` #### 2. 直接使用 `awk` - **原理**:利用 `awk` 的哈希表记录唯一行。 - **命令示例**: ```bash awk '!seen[$0]++' file.txt > new_file.txt ``` --- ### 二、文件级(删除复文件) 适用于不同文件名但内容相同的文件清理。 #### 1. `fdupes` 工具 - **安装**:`sudo apt install fdupes`(Debian/Ubuntu)或 `sudo yum install fdupes`(CentOS)。 - **常用命令**: ```bash fdupes -r /path/to/directory # 递归扫描目录,列出复文件 fdupes -rd /path/to/directory # 交互式删除(需手动确认保留哪个文件) ``` #### 2. 基于哈希值比较(如 `md5sum`/`sha256sum`) - **原理**:通过计算文件哈希值判断内容是否相同。 - **脚本示例**: ```bash find /path/to/dir -type f -exec md5sum {} + | sort | uniq -w32 -dD # 解释: # 1. 计算所有文件的 MD5 # 2. 按哈希排序,显示复项 # 3. 根据结果手动删除复文件 ``` #### 3. `rmlint` 工具 - **特点**:快速查找复文件、空文件等,支持多种删除策略。 - **安装**:`sudo apt install rmlint` - **使用**: ```bash rmlint /path/to/directory ./rmlint.sh -d # 执行生成的脚本删除复文件 ``` --- ### 三、高级场景 #### 1. 硬链接代替复文件 - **原理**:通过硬链接合并复文件,节省磁盘空间。 - **工具**:`rmlint --hardlink` 或手动操作: ```bash find /path -type f -links +1 # 查找已有硬链接的文件 ``` #### 2. 文件系统级 - **Btrfs/ZFS**:支持透明压缩和块级,需在文件系统初始化时配置。 --- ### 四、注意事项 1. **备份数据**:删除操作前建议备份要文件。 2. **谨慎删除**:确保复文件确实无用,尤其是系统文件。 3. **性能影响**:大文件哈希计算可能耗时,建议在低负载时操作。 根据需求选择合适的方法,文本行推荐 `sort -u`,文件级推荐 `fdupes` 或 `rmlint`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值