Shell脚本数组格式化:将无序数字数组转为指定连续区间格式
解决方案
可以通过遍历数组并追踪连续数字的起始和结束值,将数组格式化为指定的范围字符串。以下是完整的Shell脚本实现:
# 定义原始数组 nums=(4 5 6 7 9 10 14 15 16 18 19 20 22 23 24 25 27 28 29 30) # 如果数组未排序,可取消下面这行注释进行排序 # nums=($(printf '%s\n' "${nums[@]}" | sort -n)) # 初始化存储范围的数组和追踪变量 ranges=() start=${nums[0]} prev=${nums[0]} # 遍历数组从第二个元素开始 for num in "${nums[@]:1}"; do # 检查当前数字是否与前一个数字连续 if (( num != prev + 1 )); then # 如果起始值等于前一个值,说明是单个数字 if (( start == prev )); then ranges+=("$start") else # 否则是一个连续范围 ranges+=("$start-$prev") fi # 更新起始值为当前数字 start=$num fi # 更新前一个数字为当前数字 prev=$num done # 处理最后一组连续数字或单个数字 if (( start == prev )); then ranges+=("$start") else ranges+=("$start-$prev") fi # 将范围数组合并为单个字符串,用空格分隔 output=$(IFS=' '; echo "${ranges[*]}") # 输出结果 echo "$output"
代码说明:
- 数组初始化:定义原始数字数组,若数组未排序,可通过
sort -n命令先排序。 - 追踪变量:
start记录当前连续范围的起始值,prev记录上一个遍历到的数字。 - 遍历逻辑:
- 每次检查当前数字是否与前一个数字连续(即
num == prev + 1)。 - 若不连续,将当前范围(单个数字或起始-结束)加入
ranges数组,并重置start为当前数字。
- 每次检查当前数字是否与前一个数字连续(即
- 收尾处理:遍历结束后,将最后一组范围加入
ranges数组。 - 合并结果:通过设置
IFS=' '将ranges数组合并为空格分隔的字符串,赋值给output变量。
运行脚本后,output变量的值即为:4-7 9-10 14-16 18-20 22-24 25 27-30。
内容的提问来源于stack exchange,提问作者krishna narreddula
相关产品推荐
相关产品推荐

