【问题标题】:Evaluating overlap of number ranges in bash评估bash中数字范围的重叠
【发布时间】:2017-06-26 22:43:33
【问题描述】:

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

$cat file
101-297
1299-1314
1301-5266
6898-14503

如何在 bash 中确认这些数字范围中的一个或多个是否重叠?

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

if [ "$upperbound_range1" -gt "$lowerbound_range2" ]; then
    echo "Overlap!"
    exit 1
fi

不过,我怀疑这种比较也可以通过 awk 来完成。

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

【问题讨论】:

    标签: bash for-loop awk range comparison


    【解决方案1】:

    在 awk 中尝试。

    awk -F"-" 'Q>=$1 && Q{print}{Q=$NF}'   Input_file
    

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

    编辑:根据 OP 用户想要获取上一行,因此现在也将其更改为该行。

    awk -F"-" 'Q>=$1 && Q{print val}{Q=$NF;val=$0}'  Input_file
    

    【讨论】:

    • 优秀的答案。是的,您将如何修改打印语句以打印上一行而不是当前行?
    • @MichaelGruenstaeudl:现在请检查我编辑的答案,如果这对您有帮助,请告诉我。
    • 效果很好!谢谢。
    • 请看我的后续问题 (stackoverflow.com/questions/44763337/…)。非常感谢您的意见!
    • 那里也回答了:)
    【解决方案2】:

    你可以这样做:

    $ 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
    

    【讨论】:

      【解决方案3】:

      如果范围按下限排序,并且有一个范围重叠,则重叠范围将是后继范围。

      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
      

      【讨论】:

      • 谢谢,但是你测试过这段代码吗?看起来,循环似乎没有遍历范围。 for ((i=1; i&lt;${#ranges[@]}; i+=1)); do echo $i; done
      • 好的,第一行数组初始化时似乎缺少括号,并用注释行检查:ranges=( $(&lt;file) ) 而不是ranges=$(&lt;file)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多