У меня очень большой файл имеет края с некоторыми численными атрибутами (значениями корреляции генов-генов.
Solyc06g071220.1.1 Solyc03g119900.3.1 -0.103908702731133 0.84469789799632
Solyc06g021220.1.1 Solyc06g082440.1.1 -0.224259048700333 0.669250658547268
Solyc06g031220.1.1 Solyc03g062750.1.1 0.71688175201416 0.108887108533016
Solyc06g031220.1.1 Solyc04g055160.3.1 0.0175280850380659 0.973710565052682
Solyc06g041220.1.1 Solyc09g065990.3.1 0.390961289405823 0.443437425098591
Solyc06g031220.1.1 Solyc01g109440.2.1 -0.19314156472683 0.713890096929684
Solyc06g071220.1.1 Solyc06g065310.3.1 -0.0117298867553473 0.982405976825965
Solyc06g071220.1.1 Solyc04g078470.3.1 -0.325205653905869 0.529388185554353
Solyc06g071220.1.1 Solyc01g008510.3.1 0.7591872215271 0.0800037292660498
Solyc04g078470.3.1 Solyc06g031220.1.1 0.891855001449585 0.0169106147650597
Solyc04g055160.3.1 Solyc06g031220.1.1 0.0175280850380659 0.973710565052682
учитывая другой файл input.txt, он должен иметь возможность извлекать всех своих соседей:
input.txt
Solyc06g031220.1.1
Выход:
Solyc06g031220.1.1 Solyc03g062750.1.1 0.71688175201416 0.108887108533016
Solyc06g031220.1.1 Solyc04g055160.3.1 0.0175280850380659 0.973710565052682
Solyc06g031220.1.1 Solyc01g109440.2.1 -0.19314156472683 0.713890096929684
Solyc04g078470.3.1 Solyc06g031220.1.1 0.891855001449585 0.0169106147650597
Solyc04g055160.3.1 Solyc06g031220.1.1 0.0175280850380659 0.973710565052682
Поскольку сеть неориентирована, AB и BA являются одинаковыми и должны быть удалены.
Я выполнил путь python, т.е. разделил каждую строку на основе пространства и проверил наличие идентификаторов генов в первых двух элементах списка. Но это занимает очень много времени для прохождения файла. Просьба помочь
file1=open("correlation_v1.txt", 'r')
file2=open("input.txt", "r")
file1_id=file1.readlines()
file2_id=file2.readlines()
for i in file1_id:
gene_id=i.split()
gene_id[0]=gene_id[0].strip()
gene_id[1]=gene_id[1].strip()
for j in file2_id:
loc_id=j.split()
loc_id[0]=loc_id[0].strip()
if ((loc_id[0] == gene_id[0]) or (loc_id[0] == gene_id[1])):
print i,"\t", j
Если, поскольку сеть неориентирована, AB и BA одинаковы и должны быть удалены, означает, что в случае:
A B 1 2
B A 1 2
выход должен быть
A B 1 2
Awk:
$ awk '
NR==FNR {s=$0; next }
($1==s||$2==s) && ($1!=a[$2]&&$2!=a[$1]) {
a[$1]=$2
a[$2]=$1
print
}' <(echo A) file
выходы:
A B 1 2
Вывод с вашими данными (awk '...' input.txt file
):
Solyc06g031220.1.1 Solyc03g062750.1.1 0.71688175201416 0.108887108533016
Solyc06g031220.1.1 Solyc04g055160.3.1 0.0175280850380659 0.973710565052682 # this is a duplicate
Solyc06g031220.1.1 Solyc01g109440.2.1 -0.19314156472683 0.713890096929684
Solyc06g031220.1.1 Solyc04g078470.3.1 -0.325205653905869 0.529388185554353
Это можно легко сделать с помощью grep
:
grep -F -w -f input.txt filename
-F
заставляет искать -F
строки вместо шаблона regexp. -w
заставляет строку искать в целом. И -F
позволяет получить шаблон для поиска из входного файла.
grep
?