Извлечение соседей первой степени из файла

1

У меня очень большой файл имеет края с некоторыми численными атрибутами (значениями корреляции генов-генов.

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
  • 0
    Ты не можешь просто сделать это с помощью grep ?
  • 0
    Вы сделали что-то в Python, но это было слишком медленно? Покажите, что вы сделали.
Теги:
awk

2 ответа

1
Лучший ответ

Если, поскольку сеть неориентирована, 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
2

Это можно легко сделать с помощью grep:

grep -F -w -f input.txt filename

-F заставляет искать -F строки вместо шаблона regexp. -w заставляет строку искать в целом. И -F позволяет получить шаблон для поиска из входного файла.

  • 0
    да, спасибо, я пытался с grep, но не знал о '-w'
  • 0
    Это не удовлетворяет требованию: поскольку сеть ненаправленная, AB и BA одинаковы и должны быть удалены (если я правильно понял).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню