使用 shell 脚本检查另一个文件中的数字是否在范围内,并输出该匹配的所有信息

使用 shell 脚本检查另一个文件中的数字是否在范围内,并输出该匹配的所有信息

我有两个输入文件

File A

chr1    1167639 0
chrX    114868305   14
chr1    1167653 0
chr11   62389325    2
chr9    140127768   17

File B

chr10   73082492    73082831 SLC29A3
chr11   46332562    46332760 CREB3L1
chr11   62389317    62389439 B3GAT3
chrX    22056566    22056675 PHEX
chrX    114868291   114868413 PLS3

这是我想要的输出

chrX    114868305   14 chrX    114868291   114868413   PLS3
chr11   62389325    2  chr11   62389317    62389439    B3GAT3

我想要的是:在文件B的第1列中找到文件A的第1列元素。如果字符串相同,则取文件A的第2列的编号,并检查它是否包含在文件B的编号范围内文件 B 的第 2 列和第 3 列。如果包含,则在输出中将文件 A 和文件 B 的行打印在一行中。

答案1

$ cat tst.awk
BEGIN { OFS="\t" }
NR==FNR {
    ++cnt[$1]
    beg[$1,cnt[$1]] = $2
    end[$1,cnt[$1]] = $3
    val[$1,cnt[$1]] = $0
    next
}
$1 in cnt {
    for (i=1; i<=cnt[$1]; i++) {
        if ( (beg[$1,i] <= $2) && ($2 <= end[$1,i]) ) {
            print $0, val[$1,i]
        }
    }
}

$ awk -f tst.awk fileB fileA
chrX    114868305   14  chrX    114868291   114868413 PLS3
chr11   62389325    2   chr11   62389317    62389439 B3GAT3

上面假设您想​​要制表符分隔的输出,如果您不想要,则将其删除BEGIN { OFS="\t" },如果您希望它在视觉上以表格形式显示,则将其通过管道传输到column -t.

相关内容