unix Shell脚本-折叠数字[已关闭]

sr4lhrrt  于 2023-01-02  发布在  Unix
关注(0)|答案(2)|浏览(180)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

16小时前关门了。
Improve this question
我正在尝试将数字折叠起来,这样它们就更容易阅读了。到目前为止,我有一个像这样的数据集:1,2,3,4我试着把它们分解成:1-4.
然而,当我有一个像"1,2,4,5,6"这样的数据集(有缺失的数字)时,我不能将它们折叠成1,2,4 - 6。
对于没有任何缺失数字的数据集,可以容易地用以下方式来完成:
数据="1、2、3、4"
回显$数据|awk-F "," {打印$1 "-" $NF} "
我已经创建了一个脚本,可以崩溃的数字,但有几个问题。我觉得这是一个失败的战斗,因为脚本是超过120行长,我肯定过于复杂。
乐意为如何做到这一点的任何建议?

z2acfund

z2acfund1#

这段Shellcheck-clean pure Bash代码演示了一种完成您所需任务的方法:

#! /bin/bash -p

data='1,2,4,5,6'

IFS=, read -r -a numbers <<<"$data"

range_start=
range_end=
sep=
for num in "${numbers[@]}" _; do
    if [[ -z $range_start ]]; then
        range_start=$num
        range_end=$num
    elif [[ $num != _ && num -eq range_end+1 ]]; then
        range_end=$num
    else
        if (( range_end == range_start )); then
            printf '%s%s' "$sep" "$range_start"
        elif (( range_end == (range_start+1) )); then
            printf '%s%s,%s' "$sep" "$range_start" "$range_end"
        else
            printf '%s%s-%s' "$sep" "$range_start" "$range_end"
        fi
        sep=,
        range_start=$num
        range_end=$num
    fi
done
printf '\n'

输出为:

1,2,4-6
c2e8gylq

c2e8gylq2#

如果要跳过缺少数字的行(并且序列是单调递增的),请执行以下操作

echo $DATA | awk -F"," '$NF == NF {print $1"-"$NF}'

相关问题