Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Shell 给定列表上所需的端口范围_Shell_Sorting_Range - Fatal编程技术网

Shell 给定列表上所需的端口范围

Shell 给定列表上所需的端口范围,shell,sorting,range,Shell,Sorting,Range,我有一个端口列表,我想打印一个范围,如下所示。输出范围应为+/-10个值 端口列表 8983,8985,8983,8985,9983,8993,8987,8997,8995,9854,9985,9975,9976,9977,9978,9979,9980,9997,9987,9995,9993,8925,2181,2189,2185,2187,2183,2191,2193,2195 ** 尝试对其进行排序,但需要范围逻辑。 ** 使用GNU awk(因为PROCINFO[“sorted_in”]

我有一个端口列表,我想打印一个范围,如下所示。输出范围应为+/-10个值

端口列表

8983,8985,8983,8985,9983,8993,8987,8997,8995,9854,9985,9975,9976,9977,9978,9979,9980,9997,9987,9995,9993,8925,2181,2189,2185,2187,2183,2191,2193,2195
** 尝试对其进行排序,但需要范围逻辑。 **

使用GNU awk(因为
PROCINFO[“sorted_in”]=“@ind_num_asc”
)。它丢失了副本,但我不明白为什么它不会:

$ gawk '
BEGIN {
    FS=","
}
{
    for(i=1;i<=NF;i++)                         # hash all values to a hash
        a[$i]
}
END {
    PROCINFO["sorted_in"]="@ind_num_asc"       # process in ascending order
    for(i in a) {
        if(p=="") {                            # new row starts
            printf "%s%d",(j++==0?"":ORS),p=i 
            continue
        }
        if((i-p)<10) {                         # 10 hardcoded here
            p=i                                # buffer to p if smaller
        } else {                               # or output if bigger
            printf " - %d\n%d",p,i
            p=""
        }
    }
    if(p)                                      # cleanup after last value
        printf " - %d\n",p
    else
        print ""
}' file

范围应为+/-10值
这意味着什么?输出范围不应大于或小于10。不需要额外的端口范围。如果端口更接近前一个端口的+/-10,那么我们可以将其设置为范围。
2181-2195
不是更大吗?那是14。。。应该一分为二吗?无论如何,您有一个唯一编号的排序列表。因此,读取一个数字(在awk或bash中),查看当前数字是否大于上一个数字的1-如果大于,则表示它是一个范围,增加一些变量并读取下一行-如果不是,则输出缓存的/“previous”范围(如果有),该数字成为当前范围的开始。网上有很多很棒的awk教程。非常感谢在这个论坛上展示你做了什么研究?你试过什么?你到底被困在哪里?2181 2183 2185 2187 2189 2191 2193 2195-->所有这些数字的范围差别不大。所以我们可以加入2181-2195。如果我们的数字是2187、2190、2195和2207,那么输出应该是2187-2195和2207
2181 - 2195
8925
8983 - 8997
9854
9975 - 9997
$ gawk '
BEGIN {
    FS=","
}
{
    for(i=1;i<=NF;i++)                         # hash all values to a hash
        a[$i]
}
END {
    PROCINFO["sorted_in"]="@ind_num_asc"       # process in ascending order
    for(i in a) {
        if(p=="") {                            # new row starts
            printf "%s%d",(j++==0?"":ORS),p=i 
            continue
        }
        if((i-p)<10) {                         # 10 hardcoded here
            p=i                                # buffer to p if smaller
        } else {                               # or output if bigger
            printf " - %d\n%d",p,i
            p=""
        }
    }
    if(p)                                      # cleanup after last value
        printf " - %d\n",p
    else
        print ""
}' file
2181 - 2195
8925
8983 - 8997
9854
9975 - 9997