2012-12-04 31 views
4

目前,我有從命令數字的有序輸出:在Bash中,如何將數字列表轉換爲數字範圍?

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

我想這些凝結表數爲單數或數字

的範圍的列表

18-19,62,161-163,165

我想過嘗試在bash中對數組進行排序,然後讀取下一個數字,看看它是否爲+1 ...我有一個基本相同的PHP函數,但我無法將其轉換爲Bash:

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霍瓦特一個快速的答案,我用完成我的項目。我肯定會對那裏的任何更簡單的解決方案感興趣。

+1

「但我有麻煩它調換到Bash「 - 哪部分你有問題? –

+0

你想爲這款遊戲推出代碼高爾夫嗎? ':-)' –

+0

@KarolyHorvath我遇到的問題是將列表放到數組中,迭代數組並輸出,只是不太清楚語法。 – jjclarkson

回答

4

是,外殼程序變量替換,如果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 
+2

我可能推薦'tr'而不是' sed'用於單字符翻譯? 'tr,'\ n''(對於這個問題,你可以使用參數擴展並跳過子shell。) – kojiro

+0

@kojiro:yepp,這將工作。 (老實說,如果我編寫shell腳本,我從不擔心性能......如果它很重要,我會選擇一種不同的語言。順便說一句,我永遠不會在shell腳本中實現這一點,但嘿,這就是OP要求的:) –

+2

如何使用'IFS =,'而不是'sed'? – xiaoyi

相關問題