【发布时间】:2018-05-10 20:53:30
【问题描述】:
我有一个包含职位列表(第 1 + 2 列)和与这些职位相关的值的文件:
文件1.txt:
1 20 A G
4 400 T C
1 12 A T
2 500 G C
还有一些位置相同的另一个文件。可能有多行与 File1.txt 中的位置相同
文件2.txt
#CHR POS Count_A Count_C Count_G Count_T
1 20 0 18 2 0
4 400 0 0 0 1
1 12 0 7 0 40
4 400 0 1 0 1
5 50 16 0 0 0
2 500 9 0 4 0
我需要输出一个 File1.txt 版本,不包括任何同时满足这两个条件的行:
1:如果位置(第 1+2 列)在 File1.txt 和 File2.txt 中匹配 2:如果 File2.txt 中与该位置的 File1.txt 第 4 列中的字母(A,G,C,T) 匹配的列中的计数 > 0。
因此对于上面的示例,不会输出 File1.txt 的第一行,因为在 file2.txt 中匹配的行(基于前 2 列:1 20),第 4 列有字母 G,为此File2.txt 中的行 Count_G 列 > 0。
此示例将输出的唯一行是:
2 500 G C
对我来说,特别棘手的部分是 file2.txt 中可以有多个匹配的行,如果 File2.txt 中的相应列在 File2 中的一行中 >0,我想排除 File1.txt 中的行。文本。这意味着在上面的示例中,不会包含 File1.txt 的第 2 行,因为 Count_C 在 File2.txt 中第二次出现时 > 0 (Count_C = 1)。
我不确定这种过滤是否可以一步完成。在 File1.txt 中输出行列表是否更容易,其中 File2.txt 中 File1.txt 中第 4 列中的字母的计数> 0。然后使用此列表与 File1.txt 进行比较并删除两个文件中出现的任何行?
我之前使用下面的代码根据另一个文件中的值过滤了一个文件,但这是针对 file2.txt 中只有一列值要过滤的情况。我不确定如何进行条件过滤,以便根据 file1.txt 的第 4 列中的字母检查右列
我当前的代码是在 python 中,但欢迎任何解决方案:
f2 = open('file2.txt', 'r')
d2 = {}
for line in f2.split('\n'):
line = line.rstrip()
fields = line.split("\t")
key = (fields[0], fields[1])
d2[key] = int(fields[2])
f1 = open('file1.txt', 'r')
for line in file1.split('\n'):
line = line.rstrip()
fields = line.split("\t")
key = (fields[0], fields[1])
if d2[key] > 1000:
print line
我认为我之前的解决方案已经非常冗长,并且觉得可能有一个简单的工具可以解决我不知道的这类问题。
【问题讨论】:
-
我建议您远离代码,用文字描述解决当前问题所需的步骤。一旦你清楚地了解了这些步骤,就可以开始将其翻译成 Python。