【问题标题】:Filter a large text file using ID in another text file使用另一个文本文件中的 ID 过滤大型文本文件
【发布时间】:2016-01-01 21:04:55
【问题描述】:

我有一个两个文本文件,一个文件由大约 60,000 行和 14 列组成,另一个文件有一列包含第一个文件中的一个列(第一列)的子集。我想根据文件 2 中的 ID 名称过滤文件 1。我在网上尝试了一些命令,但没有一个没有用。就是几行两个文本文件(我是linux系统)

文件 1:

Contig100       orange1.1g013919m       75.31   81      12      2       244     14      2       78      4e-29     117   1126    435
Contig1000      orange1.1g045442m       65.50   400     130     2       631     1809    2       400     1e-156    466   2299    425
Contig10005     orange1.1g003445m       83.86   824     110     2       3222    808     1       820     0.0      1322   3583    820
Contig10006     orange1.1g047384m       81.82   22      4       0       396     331     250     271     7e-05   41.6    396     412

文件 2:

Contig1
Contig1000
Contig10005
Contig10017

请告诉我您解决此问题的好建议。

提前致谢。

【问题讨论】:

    标签: text filtering


    【解决方案1】:

    你可以用 python 做到这一点:

    with open('filter.txt', 'r') as f:
        mask = f.read()
    
    with open('data.txt', 'r') as f:
        while True:
            l = f.readline()
            if not l:
                break
            if l.split(' ')[0] in mask:
                print(l[:-1])
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 Linux/Mac,则可以在命令行上执行($ 表示命令提示符,请勿键入)。

      首先,我们通过将.* 附加到每一行,从您的file2 创建一个file2-patterns

      $ while read line; do echo "$line .*"; done < file2 > file2-patterns
      

      看看那个文件:

      $ cat file2-patterns 
      Contig1 .*
      Contig1000 .*
      Contig10005 .*
      Contig10017 .*
      

      现在我们可以使用这些模式过滤掉来自file1 的行。

      $ grep -f file2-patterns file1
      Contig1000      orange1.1g045442m       65.50   400     130     2       631     1809    2       400     1e-156    466   2299    425
      Contig10005     orange1.1g003445m       83.86   824     110     2       3222    808     1       820     0.0      1322   3583    820
      

      【讨论】:

      • 感谢您的及时回复。抱歉,我是这个领域的新手。请您告诉我应该如何执行您的解决方案?
      • 现在,我得到了您的解决方案。但是,我有一个大文件 2,您能否告诉我在文件 2 的每一行中添加 .* 的正确命令?
      • 对不起我愚蠢的 cmets。我没有注意到您从文件文件 2 创建模式的答案的第一行。请接受我的深切歉意,非常感谢您的帮助。我试试看。
      • 我正在使用 256G RAM 的服务器上尝试您的解决方案。它在运行 40 分钟后完成,没有产生任何错误或输出。你的专业观点有什么问题?
      • 我会先在您在上面发布的较小文件上尝试一下,所以您很快就会注意到出了什么问题...(尽管它对我有用)顺便说一句,您熟悉命令行和&gt; 运营商?
      猜你喜欢
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多