根据列值追加两个边列表文件



我有两个边缘列表,例如:

文件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

因为我的图是无向的,并且基因A-基因B与基因B-基因A相同

我尝试使用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]

任何更快的方法都非常感谢。谢谢。

获取独立于其组件值顺序的键的惯用方法是对它们进行排序,因此无论值在输入中出现的顺序如何,它们在键中的顺序始终相同:

$ 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

你可以试试这个 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中时,主循环仅打印该行。

最新更新