繁体   English   中英

根据另一个过滤一个文本文件

[英]filter one text file based on another

星期五下午,我正在努力根据另一个文件的内容过滤一个文件。 我有一个带有制表符分隔值列表的文件,例如

1   H   3   0.3937180424
1   H   4   0.3594894329
1   H   5   0.3501040944
1   H   6   0.2699868938
1   H   7   0.3200876953
1   H   8   0.3047540533
1   H   9   0.3088543852
1   H   10  0.305982215
1   H   11  0.2798568174

和另一个带有制表符分隔值的文件,例如

chr1    1   74440
chr1    2   90281
chr1    3   136529
chr1    4   484700
chr1    5   294898
chr1    6   284812
chr1    7   432322
chr1    8   458256
chr1    9   290078
chr1    10  366518
chr1    11  342903

我想过滤第二个文件,使其仅在第一个文件中包含位置。 当前,第二个文件中有多余的行,其中一些需要删除。 位置信息来自第一个文件组合的第一和第三列。 因此,示例第一行中的位置信息为1 3.,意味着染色体1位置3。这对应于第二个文件(第三行)中的chr1 3。 有谁知道一种简单的方法来按文件1过滤文件2。如果可以简化文件,我可以删除文件2中的'chr'字符串。 我可以在shell或python(学习该语言)中使用的任何快速解决方案都非常好。 然后需要解决此问题才能在分析中使用输出。

在此先感谢您的帮助,

红宝石

假设您使用bash作为外壳,这可能会起作用。 我不确定file1.txt是否很大。

grep -f <( awk '{print "chr"$1"\t"$3}' file1.txt ) file2.txt

您要求使用python:

#!/usr/bin/env python

F = {}

with open("f1") as fd:
    for line in fd:
        key="chr%s%s" % (line.split()[0], line.split()[2])
        F[key]=True

with open("f2") as fd:
    for line in fd:
        key="%s%s" % (line.split()[0], line.split()[1])

        if key in F:
            print line.strip()

输出:

chr1    3   136529
chr1    4   484700
chr1    5   294898
chr1    6   284812
chr1    7   432322
chr1    8   458256
chr1    9   290078
chr1    10  366518
chr1    11  342903

只用awk:

awk -F '\t' '
  FILENAME == ARGV[1] { pair["chr" $1 FS $3] = 1; next }
  ($1 FS $2) in pair
' file1 file2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM