добавление двух файлов списка ребер на основе значений столбцов - PullRequest
0 голосов
/ 22 октября 2018

У меня есть два крайних списка , таких как:

Файл1

geneA geneB 0.89

geneA geneD 0.69

geneC geneA 0.76

Файл2

geneC geneF rank1

geneB geneA rank56

geneA geneC rank20

После сравнения файлов1 и файлов2,

Я должен получить:

geneA geneB 0.89 rank56

geneC geneA 0.76 rank20

, поскольку мой график не направлен и geneA-geneB равен , такой же как geneB-geneA .

Я пробовал с python, который занимает значительное время:

f=open('file1.txt', 'r')
f1=open('file2.txt','r')


for i in f.readlines():
    i=i.strip()
    gene_info=i.split()
    gene_info[0]=gene_info[0].strip()
    gene_info[1]=gene_info[1].strip()
    #print gene_info[0], gene_info[1]

for j in f1.readlines():
    i=i.strip()
    loc_info=i.split()
    loc_info[0]=loc_info[0].strip()
    loc_info[1]=loc_info[1].strip()
    if (gene_info[0]==loc_info[0] and gene_info[1]==loc_info[1])or (gene_info[0]==loc_info[1] and gene_info[1]==loc_info[0]):
        print j, '\t', gene_info[2]

Любой более быстрый способ очень важен.Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Идиоматический способ получить ключ, который не зависит от порядка значений его компонентов, состоит в их сортировке, поэтому независимо от порядка появления значений на входе они всегда имеют одинаковый порядок в ключе:

$ cat tst.awk
{ key = ($1 > $2 ? $1 FS $2 : $2 FS $1) }
NR==FNR { a[key] = $3; next }
key in a { print $0, a[key] }

$ awk -f tst.awk file2 file1
geneA geneB 0.89 rank56
geneC geneA 0.76 rank20
0 голосов
/ 22 октября 2018

Вы можете попробовать этот скрипт awk:

awk 'NR==FNR{
       a[$1,$2]=$3;
       a[$2,$1]=$3;
       next
     }
     (($1,$2)in a){
        print $1,$2,a[$1,$2],$3
     }' file1 file2

Массив a хранит десятичное значение для обеих комбинаций 2 индексов.

Основной цикл печатает только строку, когда оба индекса находятся в массиве a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...