Bash 当一个文件的列包含另一个文件在给定范围之间的位置时,使用Awk和条件捕捉行

Bash 当一个文件的列包含另一个文件在给定范围之间的位置时,使用Awk和条件捕捉行,bash,awk,range,multiple-columns,Bash,Awk,Range,Multiple Columns,我想确定每个基因的得分 然而,对于这一点,我需要设置一个条件来标识位于基因列表的给定范围$3和$4之间的一个位置的分数(列$3分数列表) 基因列表: chr1 TAS1R1 6615000 6615100 chr1 TAS1R1 6615130 6615200 chr5 TCERG1 145858055 145858216 rs79923433 chr1 6615060 0.327009537545002 0.177578086220885 rs4908925 ch

我想确定每个基因的得分 然而,对于这一点,我需要设置一个条件来标识位于基因列表的给定范围$3和$4之间的一个位置的分数(列$3分数列表)

基因列表:

chr1    TAS1R1  6615000 6615100
chr1    TAS1R1  6615130 6615200
chr5    TCERG1  145858055   145858216
rs79923433 chr1 6615060 0.327009537545002 0.177578086220885
rs4908925 chr1 6615107 0.492182375024342 0.278821401692196
rs114220820 chr1 6615172 0.24581165286421 0.129806066087895
rs925345 chr5 145858100 1.22569136462918 0.744498627741366
chr1    TAS1R1  6615000 6615100 0.327009537545002
chr1    TAS1R1  6615130 6615200 0.24581165286421
chr5    TCERG1  145858055   145858216 1.22569136462918
得分列表:

chr1    TAS1R1  6615000 6615100
chr1    TAS1R1  6615130 6615200
chr5    TCERG1  145858055   145858216
rs79923433 chr1 6615060 0.327009537545002 0.177578086220885
rs4908925 chr1 6615107 0.492182375024342 0.278821401692196
rs114220820 chr1 6615172 0.24581165286421 0.129806066087895
rs925345 chr5 145858100 1.22569136462918 0.744498627741366
chr1    TAS1R1  6615000 6615100 0.327009537545002
chr1    TAS1R1  6615130 6615200 0.24581165286421
chr5    TCERG1  145858055   145858216 1.22569136462918
我想要的:

chr1    TAS1R1  6615000 6615100
chr1    TAS1R1  6615130 6615200
chr5    TCERG1  145858055   145858216
rs79923433 chr1 6615060 0.327009537545002 0.177578086220885
rs4908925 chr1 6615107 0.492182375024342 0.278821401692196
rs114220820 chr1 6615172 0.24581165286421 0.129806066087895
rs925345 chr5 145858100 1.22569136462918 0.744498627741366
chr1    TAS1R1  6615000 6615100 0.327009537545002
chr1    TAS1R1  6615130 6615200 0.24581165286421
chr5    TCERG1  145858055   145858216 1.22569136462918
使用awk:

awk '
    NR == FNR {score[$3] = $4; next}
    {
        for (key in score) 
            if ($3 <= key && key <= $4) 
                print $0, score[key]
    }
' score.list gene.list 

这不是超高效的,因为你必须迭代每行基因的所有分数,但它非常简单。

我尝试过为每个位置创建bash命令,但这对于gene_list
中的s来说太长了
;是否回显“awk”开始{“$s”}{如果(iSS3)打印SS4;否则打印99999}分数列表|排序-g |头-n1”;完成| sed's/SS/$/g'>script.sh
然后使用每个script.sh搜索整个genomeI将开始按顺序组合文件,然后我们可以尝试下一步:
cat gene_list score_list | sort-k 3-n>combined_list
。请将您的代码作为Q的一部分发布。如果您显示当前输出,也会有所帮助。祝你好运。你想把分数列表中的
$4
字段附加到基因列表中的每一行,其中分数列表字段
$3
位于该行的基因列表字段
$3
$4
之间?谢谢你,杰克曼,这仍然比我以前花了太长时间的代码要好。我完成了其中一个文件,我可以这么说使用您的命令行时效果要好得多:)谢谢@Jackman!如果我想做相反的事情?打印“rs79923433 chr1 6615060 0.327009537545002 0.177578086220885 TAS1R1”我需要做哪些更改?