【问题标题】:identify min and max values of overlapping ranges from mutiple matches从多个匹配项中识别重叠范围的最小值和最大值
【发布时间】:2020-02-05 21:18:58
【问题描述】:

给定以下三列制表符分隔的列表文件,其中每行中的值 1 和值 2 表示给定匹配中的一个范围,最简单的 shell 脚本/命令将识别每个匹配的所有重叠范围并确定整个重叠的最小值和最大值?对于给定的匹配,最小值始终位于范围的第一列。但是,在匹配中,列中的值不一定是排序的。

infile.txt:

match1 857 1107
match1 879 1128
match1 969 1126
match1 865 1115
match1 1296 1546
match1 1304 1554
match1 1318 1600
match1 1408 1562
match2 300 1100
match2 639 1225
match2 4299 6546
match2 5304 7754

outfile.txt:

match1 857 1128
match1 1296 1600
match2 300 1225
match2 4299 7754

【问题讨论】:

  • 欢迎来到 SO,在 SO 上,我们鼓励人们发布他们为解决自己的问题所做的努力,所以请这样做并让我们知道。

标签: linux bash range overlapping-matches


【解决方案1】:

识别每个匹配项的所有重叠范围并确定整个重叠的最小值和最大值的最简单的 shell 脚本/命令是什么?

这个是否是最简单的shell脚本是有争议的,但每个解决方案可能都必须对范围进行排序并识别间隙,就像这样:

while read match min max
do  printf %s\\n $match\ {$min..$max}
done <infile.txt | sort -u -k1,1 -k2n |
while read match value
do  if [ $match != "$oldmatch" -o $value != $((oldvalue+1)) ]
    then    [ "$oldmatch" ] && echo $oldvalue
            printf %s\\t $match $value
    fi
    oldmatch=$match
    oldvalue=$value
done
echo $oldvalue

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多