Оболочка, как распечатать массив элементов в парах диапазонов с запятой и дефисом

У меня есть массив НЕИЗВЕСТНОГО количества элементов, которые я хочу напечатать в этом формате: item1-item2,item3-item4,item5-item6...

Например: если myarray содержит эти элементы: 0 9 11 20 22 31 33 42

Я хочу заполнить вывод следующим образом:

0-9,11-20,22-31,33-42

, я могу распечатать его только отделив элементы с запятой. Но мне нужно разделить его на несколько диапазонов:

$ printf "%s-" "${myarray[@]}"
0-9-11-20-22-31-33-42-44

спасибо за любой намек.

1
задан 8 July 2019 в 21:10

2 ответа

Можно просто использовать printf "%d-%d," "${myarray[@]}":

$ printf "%d-%d," "${myarray[@]}"
0-9,11-20,22-31,33-42,$

Однако это испытывает недостаток в заключительной новой строке и имеет дополнительную запятую, таким образом, Вы могли расширить ее до:

$ echo $(printf "%d-%d," "${myarray[@]}") | sed 's/,$//'
0-9,11-20,22-31,33-42

Это перестанет работать, если Ваш массив не будет иметь четного числа элементов (то он распечатает дополнительный 0):

$ myarray=(0 9 11 20 22 31 33)
$ echo $(printf "%d-%d," "${myarray[@]}") | sed 's/,$//'
0-9,11-20,22-31,33-0

Вы могли бы предпочесть использовать %s вместо этого, который просто оставляет последний пустым:

$ echo $(printf "%s-%s," "${myarray[@]}") | sed 's/,$//'
0-9,11-20,22-31,33-

И наконец удалите запаздывание -:

$ echo $(printf "%s-%s," "${myarray[@]}") | sed 's/[,-]*$//' 
0-9,11-20,22-31,33
3
ответ дан 3 December 2019 в 06:49

ответ terdon очень хорош. (Вероятно), медленнее, подход чистого удара был бы

a=(0 9 11 20 22 31 33 42)
pairs=()
for ((i = 0; i < ${#a[@]}; i += 2)); do
    pairs+=( "${a[i]}-${a[i+1]}" )
done
result=$(IFS=,; echo "${pairs[*]}")
echo "$result"
0-9,11-20,22-31,33-42

Или

result=$(
    for ((i = 0; i < ${#a[@]}; i += 2)); do
        echo "${a[i]}-${a[i+1]}"
    done | paste -sd,
)

Или (я не могу сопротивляться такого рода вещи),

sep="-"
for elem in "${a[@]}"; do
    printf "%s%s" "$elem" $sep
    [[ $sep == "-" ]] && sep="," || sep="-"
done | sed 's/.$//'
1
ответ дан 3 December 2019 в 06:49

Другие вопросы по тегам:

Похожие вопросы: