AWK 实现范围vlookup 功能
awk吧
全部回复
仅看楼主
level 1
XIAOJIBEN0 楼主
从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
请大佬们指教!!!
2021年06月21日 10点06分 1
level 4
你这个程序有几个问题。对第一个文件,你都用$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]
不知道这样说你明白了否。
2021年07月13日 16点07分 2
感谢,明白了,现在搞懂了这个语句索引的意义了,当时不懂$1的意思
2021年08月26日 05点08分
所以应该怎么改呀,现在我也是匹配不上
2023年03月03日 12点03分
@pandaspa 你同样问题?有完整源码可参考。
2023年03月08日 10点03分
1