从文件中提取一级邻居

时间:2018-09-04 06:35:08

标签: python bash awk

我有一个很大的文件,它的边缘带有一些数字属性(基因-基因相关值。

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

由于网络是非定向的,因此A-B和B-A相同,应将其删除。

我已经完成了python的方式,即根据空间分割每一行,并检查了前两个列表元素中是否存在基因ID。但这要花很长时间才能遍历文件。请帮助

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

2 个答案:

答案 0 :(得分:2)

这可以通过grep轻松完成:

grep -F -w -f input.txt filename

-F使其查找文字字符串而不是正则表达式模式。 -w使其将字符串作为一个整体来查找。并且-f使它成为从输入文件中搜索的模式。

答案 1 :(得分:1)

如果由于网络是非定向的,则A-B和B-A相同,应将其删除表示在以下情况下:

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