gpt4 book ai didi

linux - 将shell中的连续数字分组

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:43 30 4
gpt4 key购买 nike

$ foo="1,2,3,6,7,8,11,13,14,15,16,17"

在 shell 中,如何将 $foo 中的数字分组为 1-3,6-8,11,13-17

最佳答案

给定以下功能:

build_range() {
local range_start= range_end=
local -a result

end_range() {
: range_start="$range_start" range_end="$range_end"
[[ $range_start ]] || return
if (( range_end == range_start )); then
# single number; just add it directly
result+=( "$range_start" )
elif (( range_end == (range_start + 1) )); then
# emit 6,7 instead of 6-7
result+=( "$range_start" "$range_end" )
else
# larger span than 2; emit as start-end
result+=( "$range_start-$range_end" )
fi
range_start= range_end=
}

# use the first number to initialize both values
range_start= range_end=
result=( )
for number; do
: number="$number"
if ! [[ $range_start ]]; then
range_start=$number
range_end=$number
continue
elif (( number == (range_end + 1) )); then
(( range_end += 1 ))
continue
else
end_range
range_start=$number
range_end=$number
fi
done
end_range
(IFS=,; printf '%s\n' "${result[*]}")
}

...调用如下:

# convert your string into an array
IFS=, read -r -a numbers <<<"$foo"

build_range "${numbers[@]}"

...我们得到输出:

1-3,6-8,11,13-17

关于linux - 将shell中的连续数字分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46303582/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com