awk吧 关注:104贴子:293
  • 4回复贴,共1

AWK 实现范围vlookup 功能

只看楼主收藏回复

从t1.suggestive.txt的文件中有提出的位点信息,第一列是染色体号,第三列是在染色体上的物理位置;
Gallis_6.gff.txt文件中是注释信息,第一列是基因名,第二列是染色体号,第三列是基因的起始位置信息,第四列是基因终止位置信息。
目前想根据位点的信息,通过染色体的匹配和物理位置的范围匹配,得到位点是在那一个基因内部的信息。由于量过大,无法在EXCEL中完成,在查询了awk语句的信息之后,写出如下语句,但还是无法匹配成功。
awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$1]=$1; b[$1]=$2; c[$1]=$3; d[$1]=$4} NR>FNR{if($1==b[$1] && $3>=c[$3] && $3<=d[$4])print $1,$2,a[$1]}' Gallus_6.gff.txt t1.suggestive.txt >t1.annotation.txt
请大佬们指教!!!



IP属地:四川1楼2021-06-21 18:37回复
    你这个程序有几个问题。对第一个文件,你都用$1做数组索引,就成了
    a["8;gene;protein_coding"]="8;gene;protein_coding"
    b["8;gene;protein_coding"]="1"
    c["8;gene;protein_coding"]="5273"
    d["8;gene;protein_coding"]="10061"
    ...
    到了第二个文件,你的比较成了
    "1"==b["1"]
    50589910>=c["50589910"]
    50589910<=d[""] (第一行里没有$4)
    这个比较是比对不出什么结果的。属于算法错误。
    对第一个文件,你应该用行号NR做数组索引。
    a[NR]=$1; b[NR]=$2; c[NR]=$3; d[NR]=$4; nl=NR
    对第二个文件,你应该用循环比对第一个文件的所有行。
    for (i=1; i<=nl; i++)
    if ($1==b[i] && $3>=c[i] && $3 <= d[i]) print $1, $2, a[$1]
    不知道这样说你明白了否。


    IP属地:广西2楼2021-07-14 00:12
    收起回复