【问题标题】:Get duplicate line and the rest of the file [ Big file 50G]获取重复行和文件的其余部分[大文件50G]
【发布时间】:2021-12-09 00:22:26
【问题描述】:

我有一个大文件 50G,我想获取 重复行文件的其余部分 我使用两个命令来获取结果这需要很长时间。

sort file.tsv | uniq -d > duplicateList.tsv 
sort file.tsv | uniq -u > clean_List.tsv

您可以看到该过程重复了两次,我只想制作一个命令并返回两个结果而不使用重复的命令

注意我可以使用 linux commande 或 Python 脚本

【问题讨论】:

  • 您是否尝试过使用tee 将您的文件内容通过管道传输到不同的消费者/文件?
  • 是的,我试过 tee ,但没​​有解决我的问题
  • 请定义“很长时间”。请准确说明您是如何使用tee 以及如何/为什么“不起作用”。请显示您的 TSV 文件的几个代表性行。谢谢。
  • 我的意思是“很长时间”该过程运行两次,例如,如果第一个命令需要 15 分钟,我需要运行下一个命令并且需要 15 分钟,我想将重复的电子邮件保存在名为 duplicateList 的文件中.tsv 并在同一操作中在名为 clean_List.tsv 的文件夹中保存不重复的电子邮件,我的 TSV 文件格式是电子邮件列表 aa@email.com

标签: python sed


【解决方案1】:

这可能对你有用(GNU sed),假设文件已经排序:

sed -Ee 'N;/^(.*)\n\1$/!{P;D};:a;$w duplicatesFile' \
     -e '$d;N;/(\n.*)\1$/ba;h;s/.*\n/\n/;x;s/(.*)\n.*/\1/w duplicatesFile' \
     -e 'x;D' file > nonduplicatesFile

概述:重复项写入duplicatesFile,其余写入stdout,然后重定向到nonduplicatesFile

最初创建了一个 2 行缓冲区并匹配重复行的模式。如果不是,则将第一行打印到 stdout,然后删除并重复,直到出现重复行。

对于重复的行,首先处理文件结尾的边缘情况,其中所有剩余的行都输出到duplicatesFile并停止处理。

对于另一种情况,模式空间被复制到保持空间,然后拆分为重复和非重复。然后写入duplicatesFile 的重复项和非重复项,以换行符开头,然后使用D 命令删除换行符,这会导致重新运行 sed 命令,而不是从file 隐式获取下一行。

注意Sed 从来都不是最快的解决方案,也许在这种情况下,一段专用代码可能会提供所需的速度。

【讨论】:

    【解决方案2】:

    散列是迄今为止最快的。在 python 中是这样的:

    name = '/my/big/file'
    lines = dict()
    dups  = dict()
    with open( name ) as f:
        line = line.rstrip()
        for line in f:
            if line in lines:
                dups[ line ] = True
            else:
                lines[ line ] = True
    print( 'Duplicate(s)' )
    for line in dups:
        print( line )
    print( 'Unique(s)' )
    for line in lines:
        if line not in dups:
            print( line )
    

    Python 字典被实现为一个散列集合。

    【讨论】:

      【解决方案3】:

      我认为您正在寻找这种语法:

      sort file.tsv > >(uniq -d > duplicateList.tsv) > >(uniq -u > clean_List.tsv)
      

      它将标准输出发送到两个命令,因此排序只发生一次,其他两个并行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-10
        • 2022-11-23
        • 2019-09-10
        • 2019-09-09
        • 2018-03-19
        • 1970-01-01
        相关资源
        最近更新 更多