Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中计算数字范围的重叠_Bash_For Loop_Awk_Range_Comparison - Fatal编程技术网

在bash中计算数字范围的重叠

在bash中计算数字范围的重叠,bash,for-loop,awk,range,comparison,Bash,For Loop,Awk,Range,Comparison,假设一个文本文件文件,其中包含多行数字范围。每个范围的下限和上限用破折号分隔,并对各个范围进行排序(即范围101-297位于1299-1314之前) 如何在bash中确认一个或多个数字范围是否重叠 在我看来,所需要的似乎只是在相邻行之间迭代执行整数比较。单个整数比较可能如下所示: if [ "$upperbound_range1" -gt "$lowerbound_range2" ]; then echo "Overlap!" exit 1 fi 然而,我怀疑这种比较也可以通过

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

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

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

if [ "$upperbound_range1" -gt "$lowerbound_range2" ]; then
    echo "Overlap!"
    exit 1
fi
然而,我怀疑这种比较也可以通过awk来完成


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

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

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
ranges=($(在awk中尝试

awk -F"-" 'Q>=$1 && Q{print}{Q=$NF}'   Input_file
将此处-(破折号)设为字段分隔符,然后检查名为Q的变量是否不为NULL,其值是否大于当前行的第一个字段($1)是否为“是”,然后打印该行(如果要打印前一行,我们也可以这样做),现在创建/重新将变量Q的值指定给当前行的最后一个字段的值

编辑:根据OP,用户希望获得上一行,因此现在也将其更改为上一行

awk -F"-" 'Q>=$1 && Q{print val}{Q=$NF;val=$0}'  Input_file
你可以做:

$ 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
$awk-F“-“'$11{printf”%s:%s:Overlap\n”,最后一行,$0}
{last_line=$0;last_2=$2}'文件
1299-1314:1301-5266:重叠

谢谢,但是您测试过这段代码吗?循环似乎没有在范围内迭代。
for((i=1;看,在数组初始化的第一行中缺少括号,用注释行检查:
ranges=)$(回答很好。是的,你将如何修改打印语句以打印上一行而不是当前行?@MichaelGruenstaeudl:请现在检查我编辑的答案,并让我知道这是否对你有帮助。效果很好!谢谢。请查看我的后续问题()。我将非常感谢你的输入!回答如下:)
$ 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