0

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

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(学习该语言)中使用的任何快速解决方案都会非常棒。需要解决这个问题,然后在分析中使用输出。

在此先感谢您的帮助,

鲁巴尔

4

3 回答 3

1

假设您bash用作外壳,这可能会起作用。我不确定如果 file1.txt 很大,性能会如何。

grep -f <( awk '{print "chr"$1"\t"$3}' file1.txt ) file2.txt
于 2012-08-24T13:24:08.643 回答
1

你问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
于 2012-08-24T13:44:08.770 回答
1

只需使用 awk:

awk -F '\t' '
  FILENAME == ARGV[1] { pair["chr" $1 FS $3] = 1; next }
  ($1 FS $2) in pair
' file1 file2
于 2012-08-24T13:44:50.583 回答