Я новичок в написании сценариев bash, и мне нужна помощь в решении моей задачи... У меня есть массив:
arr=( one two tree four five six seven one four nine one two one ten )
Мне нужно изменить его на правило: Если элемент повторяется в первый раз, добавьте 1 в конец, если дважды - 2.
Ожидаемый результат:
arr=( one two tree four five six seven one1 four1 nine one2 two1 one3 ten )
Мой код:
for i in ${!arr[*]}
do
k=1
for j in ${!arr[*]}
do
if [[ ( ${arr[$i]} = ${arr[$j]} ) && ( $i > $j ) ]] ;then
arr[$i]=$(echo ${arr[$j]}$k)
((j++))
((k++))
fi
done
echo ${arr[$i]}
((i++))
done
Пожалуйста, дайте мне совет, как решить эту задачу...
все количество будет 1 в вашем решении
Почему?
((count[$arr[$i]]++))
увеличивает счетчик при каждом использовании.когда я делаю echo ${count[*]}, он содержит только 1 1 1 .....
Я исправил проблемы.
Более короткая версия:
for i in ${!arr[*]}; do ((count[${arr[$i]}]++)) && arr[$i]+=$((count[${arr[$i]}]-1)); done
@KamilCuk короче != лучше
@Barmar Пожалуйста, не могли бы вы объяснить еще одну вещь. Что мне делать, если я ожидаю следующий результат: arr=(один0 два1 три четыре3 пять шесть семь один7 четыре8 девять один10 два11 один12 десять) где числовой индекс повторяющегося элемента
Это совсем другое. Вы должны пройти через массив дважды. Первый проход обнаруживает все повторяющиеся элементы, второй проход добавляет к ним индекс.