首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >评估bash中数字范围的重叠

评估bash中数字范围的重叠
EN

Stack Overflow用户
提问于 2017-06-26 13:41:36
回答 3查看 340关注 0票数 1

假设文本文件file包含多行数字范围。每个范围的下界和上界用破折号分隔,并对各个范围进行排序(即范围101-297在1299-1314之前)。

代码语言:javascript
运行
复制
$cat file
101-297
1299-1314
1301-5266
6898-14503

如果这些数字范围中有一个或多个重叠,如何在bash中确认?

在我看来,所需要的似乎是迭代地跨相邻行执行整数比较。单个整数比较可能如下所示:

代码语言:javascript
运行
复制
if [ "$upperbound_range1" -gt "$lowerbound_range2" ]; then
    echo "Overlap!"
    exit 1
fi

然而,我怀疑这种比较也可以通过awk进行。

注意:理想情况下,代码不仅可以确定任何区域是否与其直接后续范围重叠,还可以确定哪个范围是重叠的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-26 14:04:42

试试看。

代码语言:javascript
运行
复制
awk -F"-" 'Q>=$1 && Q{print}{Q=$NF}'   Input_file

在这里-(破折号)作为字段分隔符,然后检查名为q的变量是否为NULL,并且它的值大于当前行的第一个字段($1),然后打印该行(如果您想打印前一行,我们也可以这样做),现在创建/重新分配变量Q的值到当前行的最后一个字段的值。

编辑:按照OP用户的要求,希望获得前面的行,所以现在也要将其更改为行。

代码语言:javascript
运行
复制
awk -F"-" 'Q>=$1 && Q{print val}{Q=$NF;val=$0}'  Input_file
票数 1
EN

Stack Overflow用户

发布于 2017-06-26 14:18:13

你可以这样做:

代码语言:javascript
运行
复制
$ awk -F"-" '$1<last_2 && NR>1 {printf "%s: %s: Overlap\n", last_line, $0} 
                             {last_line=$0; last_2=$2}' file
1299-1314: 1301-5266: Overlap
票数 1
EN

Stack Overflow用户

发布于 2017-06-26 13:53:15

如果范围按下限排序,并且存在重叠范围,则重叠范围将是后续范围。

代码语言:javascript
运行
复制
ranges=( $(<file) )

# or ranges=(101-297 1299-1314 1301-5266 6898-14503)

for ((i=1;i<${#ranges[@]};i+=1)); do
    range=${ranges[i-1]}
    succesorRange=${ranges[i]}
    if ((${range#*-}>=${succesorRange%-*})); then
        echo "overlap $i $range $succesorRange"
    fi
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44761166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档