У меня есть массив НЕИЗВЕСТНОГО количества элементов, которые я хочу напечатать в этом формате: 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
спасибо за любой намек.
Можно просто использовать 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
ответ 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/.$//'