在bash,如何号码列表转换成数字的范围是多少?(In Bash, how to convert n

2019-08-03 12:59发布

目前,我有从命令数字的有序输出:

18,19,62,161,162,163,165

我想这些数字列表凝聚成单一的数字或数字范围的列表

18-19,62,161-163,165

我想过尝试通过在bash数组排序并读取下一个号码,看它是否是+1 ...我有一个PHP函数,基本上做同样的事情,但我有麻烦它转用于击:

foreach ($missing as $key => $tag) {
    $next = $missing[$key+1];
    if (!isset($first)) {
        $first = $tag;
    }
    if($next != $tag + 1) {
        if($first == $tag) {
            echo '<tr><td>'.$tag.'</td></tr>';
        } else {
            echo '<tr><td>'.$first.'-'.$tag.'</td></tr>';
        }
        unset($first);
    }
}

我想可能有一个一行在bash,可以做到这一点,但我的谷歌搜索短来了....

UPDATE:谢谢你@Karoly霍瓦特一个快速的答案,我用来完成我的项目。 我确实有兴趣在任何简单的解决方案在那里。

Answer 1:

是的,外壳程序变量替换,如果prev没有被设置,即行变成:

if [ -ne $n+1] 

这里是一个工作版本:

numbers="18,19,62,161,162,163,165"

echo $numbers, | sed "s/,/\n/g" | while read num; do
    if [[ -z $first ]]; then
        first=$num; last=$num; continue;
    fi
    if [[ num -ne $((last + 1)) ]]; then
        if [[ first -eq last ]]; then echo $first; else echo $first-$last; fi
        first=$num; last=$num
    else
        : $((last++))
    fi
done | paste -sd ","

18-19,62,161-163,165


文章来源: In Bash, how to convert number list into ranges of numbers?