使用另一个文本文件中的ID过滤大文本文件

时间:2016-01-01 12:47:45

标签: text filtering

我有一个两个文本文件,一个文件由大约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

请告诉我你解决这个问题的好建议。

提前致谢。

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:0)

如果您使用的是Linux / Mac,则可以在命令行中执行此操作($符号化命令提示符,不要键入它。)

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

$ 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