Linux系统下如何删除文本中的重复行

26 篇文章 0 订阅
15 篇文章 0 订阅

      在Linux系统中,如果要删除文本中的重复行,可以如何做?

      平时比较常用的方式是采用sort和uniq结合来处理.但如果要更进一步,根据文本中的某一列,而不是整行

来进行是否重复的判断,并对重复行进行删除,要如何做呢?

      Google了一些资料,如下:

      1. 枪声依旧 Linux下利用awk进行文本统计

      2. sed与awk去除重复行

      3. awk 不排序删除重复行

 

      其中,在1)中,介绍了下面这种方法来解决上面提出的问题:

awk '!a[$0]++' src.txt > dest.txt 

 

      而对这种方法的解释,在3)做了描述,下面是一段转贴:

 简要解释一下,awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。

我们这里写的 awk 命令是 !x[$0]++,意思是,首先创建一个 map 叫 x,然后用当前行的全文 $0 作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。由于表达式之后有 ++,因此如果某个 key 找不到对应的 value,该 ++ 操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。

注:该处的map类似于array数组,只不过在awk中叫array不恰当。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值