-1

给定以下三列制表符分隔的列表文件,其中每行中的值 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

输出文件.txt:

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

1 回答 1

0

什么是最简单的 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
于 2019-10-09T12:53:07.760 回答