美文网首页
转:不排序去除文件中的重复行

转:不排序去除文件中的重复行

作者: 飞翔你我 | 来源:发表于2016-07-20 12:03 被阅读65次

通常如果我们想获取一个文件里不重复的行的时候,我们可以直接通过 sort -u命令,先把文件排序,然后去掉连续的重复行就行。
可是,如果我们去掉重复行之后,还想保留文件原有的顺序,该怎么办呢?虽然 Linux 下有个看上去似乎很有用的命令叫uniq,但事实上 uniq命令仅仅只对连续的重复行有效。譬如我们有这样一个文件:

$ cat file
AAAA
FFFF
BBBB
BBBB
CCCC
AAAA
FFFF
DDDD

如果不排序,直接使用 uniq 命令是没有用的:

$ uniq file
AAAA
FFFF
BBBB
CCCC
AAAA
FFFF
DDDD

sort和 uniq一起用,和 sort -u 效果是一样的

$ sort -u file
AAAA
BBBB
CCCC
DDDD
FFFF

一个终极的解决方案是使用 awk:

$ awk ' !x[$0]++' file
AAAA
FFFF
BBBB
CCCC
DDDD

简要解释一下,awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。
我们这里写的 awk 命令是 !x[$0]++,意思是,首先创建一个 map 叫 x,然后用当前行的全文 $0
作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。由于表达式之后有 ++,因此如果某个 key 找不到对应的 value,该 ++操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。
我们前面说过,awk 的流程是先判断表达式,表达式为真的时候就执行语句,可是我们前面写的这个 awk 命令里只有表达式,没有语句,那我们执行什么呢?原来,当语句被省略的时候,awk 就执行默认的句,即打印整个完整的当前行。就这样,我们通过这个非常简短的 awk 命令实现了去除重复行并保留原有文件顺序的功能。

相关文章

  • 转:不排序去除文件中的重复行

    通常如果我们想获取一个文件里不重复的行的时候,我们可以直接通过 sort -u命令,先把文件排序,然后去掉连续的重...

  • shell命令,给文件内容去重排序

    一去除文件中重复的行并排序,输出到新文件 cat filename |sort|uniq > outfilenam...

  • Linux uniq 命令

    Linux uniq 命令 uniq 命令 uniq 命令可以去除排序过的文件中的重复行,因此 uniq 经常和 ...

  • Linux命令学习之:uniq命令

    Linux命令学习之:uniq命令 uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也...

  • Linux命令(3)

    sort最后结果以升序输出,-u参数是在输出行中去除重复行,-r降序,-o将输出写到源文件中,-n以数值来排序。 ...

  • Linux 常用操作命令行

    去除重复行,只保留一行 使用vim或vi命令打开要处理的文件对文档数据进行排序:sort执行去重命令g/^(.)\...

  • swift数组去重排序

    swift 数组中去除重复的办法不确保顺序 重新排序

  • 基于sort和uniq的集合操作(简单明了)

    sort:用于将文本文件内容加以排序 uniq:删除文件中重复的行,得到文件中唯一的行 交集 (用sort将a.t...

  • SAMtools——bam文件去重

    在对bam文件进行排序后,需要去除重复序列,以减少后续分析的计算压力。 sam文件转换为bam文件——SAMtoo...

  • 数组

    1. 去除数组中的重复元素 题目 已知一个已经排序的数组,去除数组中的重复元素,返回数组的长度。 思路 使用双指针...

网友评论

      本文标题:转:不排序去除文件中的重复行

      本文链接:https://www.haomeiwen.com/subject/ftyvjttx.html