根据列值附加两个边缘列表文件

时间:2018-10-22 10:27:08

标签: python awk

我有两个 edgelists ,例如:

File1

geneA geneB 0.89

geneA geneD 0.69

geneC geneA 0.76

File2

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 :(得分:2)

获取与组件值顺序无关的键的惯用方式是对它们进行排序,因此无论值在输入中出现的顺序如何,它们在键中始终保持相同的顺序:

$ 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

答案 1 :(得分:0)

您可以尝试以下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存储两个索引的两个组合的十进制值。

当两个索引都在数组a中时,主循环仅打印该行。