我有两个 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]
任何更快的方式都将受到赞赏。谢谢。
答案 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
中时,主循环仅打印该行。