Shell 给定列表上所需的端口范围
我有一个端口列表,我想打印一个范围,如下所示。输出范围应为+/-10个值 端口列表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”]
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