【发布时间】:2012-12-04 17:38:17
【问题描述】:
目前我有一个命令的数字排序输出:
18,19,62,161,162,163,165
我想将这些数字列表压缩成单个数字或数字范围的列表
18-19,62,161-163,165
我曾想过尝试在 bash 中对数组进行排序并读取下一个数字以查看它是否为 +1...重击:
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 中可能有一个单行代码可以做到这一点,但我的谷歌搜索功能不足......
更新: 感谢@Karoly Horvath 的快速回答,我曾经用它来完成我的项目。我肯定会对任何更简单的解决方案感兴趣。
【问题讨论】:
-
“但我在将其转换为 Bash 时遇到了麻烦” - 您对哪些部分有问题?
-
你想为这个启动一个代码高尔夫吗?
:-) -
@KarolyHorvath 我遇到的问题是将列表放入数组中,遍历数组并输出,只是不太了解语法。
-
那么不要使用数组。您可以 1) 一个一个地读取它们 2) 不要尝试读取下一个值,而要记住旧的值。
sed "s/,/\n/g" -
in bash
[是一个命令,所以后面需要一个空格。此外,算术需要特殊语法:if [ $prev -ne $((n+1)) ]或if (( prev != n+1 ))