У меня есть файл со списком позиций (столбцы 1 + 2) и значениями, связанными с этими позициями:
FILE1.TXT:
1 20 A G
4 400 T C
1 12 A T
2 500 G C
И еще один файл с одними и теми же позициями. Может быть несколько строк с такими же позициями, как в File1.txt
file2.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 указано число> 0, которое соответствует букве (A, G, C, T) в столбце 4 файла File1.txt для этой позиции.
Таким образом, для приведенного выше примера первая строка файла File1.txt не будет выводиться, поскольку в file2.txt для соответствующей строки (на основе первых 2 столбцов: 1 20) в 4-м столбце есть буква G, и для этого строка в File2.txt столбце Count_G> 0.
Единственная строка, которая будет выведена для этого примера, будет:
2 500 G C
Для меня особенно сложная часть заключается в том, что в file2.txt может быть несколько совпадающих строк, и я хочу исключить строки в File1.txt, если соответствующий столбец в File2.txt> 0 хотя бы в одной строке в File2. текст. Это означает, что в приведенном выше примере строка 2 файла File1.txt не будет включена, поскольку значение Count_C> 0 во второй раз, когда эта позиция появляется в файле File2.txt (Count_C = 1).
Я не уверен, возможна ли такая фильтрация за один шаг. Было бы проще вывести список строк в File1.txt, где счет в File2.txt для буквы в 4-м столбце в File1.txt> 0. Затем используйте этот список для сравнения с File1.txt и удалите все строки, которые появляются в обоих файлах?
Ранее я фильтровал один файл на основе значений в другом с помощью приведенного ниже кода, но это было, когда в файле file2.txt был только один столбец значений для фильтрации. Я не уверен, как выполнить условную фильтрацию, чтобы проверить правильный столбец на основании буквы в столбце 4 файла file1.txt
Мой текущий код написан на 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
Я думаю, что мое предыдущее решение уже очень многословно, и я чувствую, что мог бы быть простой инструмент для такого рода проблем, о которых я не знаю.