Самый простой способ изменить значения через запятую в массиве? - PullRequest
0 голосов
/ 23 апреля 2020

Допустим, у меня есть массив из n элементов. Каждый элемент представляет собой строку пар координат x, y, разделенных запятыми, например «581 284». Для этих значений x, y не задана длина символов.

Скажем, я хотел вычесть 8 из каждого значения x и 5 из каждого значения y.

Какой самый простой способ изменить x и y независимо друг от друга, без постоянного разделения кроме значений x и y?

например, первый элемент массива "581,284" становится "573,279", второй элемент массива "1013,562" становится "1005,274" и т. д.

Я работал над этой проблемой пару часов (я любитель в bash), и мне казалось, что мой подход был ужасно запутанным.

Обратите внимание, что вышеприведенные апострофы добавлены только для акцента и не являются частью проблемы.

Заранее спасибо, я какое-то время ломал голову над этим сейчас!

Редактировать: следующий отрывок - подход, который я использовал. Я не знаю много о bash, как вы можете сказать.

   while read value
   do
     if [[ -z $offset_list ]]
     then
       offset_list="$value"
     else
       offset_list="$offset_list,$value"
     fi
   done < text.txt
   new_offset=${offset_list//,/ }
   read -a new_array <<< $new_offset

   for value in "${new_array[@]}"
     do
       if [[ $((value%2)) -eq 1 ]]
       then
         value=$((value-8));
         new_array[$counter]=$value
         counter=$((counter+1));
       elif [[ $((value%2)) -eq 0 ]]
       then
         value=$((value-5));
         new_array[$counter]=$value
         counter=$((counter+1));
       fi
     done

По сути, я первоначально прочитал пары координат и убрал из них запятые, а затем планировал модифицировать нечетные / четные значения, которые были добавлены в новый массив. В этот момент я понял, что должен быть более эффективный путь.

1 Ответ

1 голос
/ 23 апреля 2020

Я считаю, что следующее должно достичь того, что вы ищете:

#!/bin/bash

input=("581,284" "1013,562")

echo "Initial array ${input[@]}"
for index in ${!input[@]}; do
    value=${input[$index]}
    x=${value%%,*}
    y=${value##*,}

    input[$index]="$((x-8)),$((y+5))"
done

echo "Modified array ${input[@]}"

${!input[@]} позволяет нам l oop по индексам массива bash.

${value%%,*} и ${value##*,} полагаются на подстановку параметров bash, чтобы удалить все после или до запятой (соответственно). Это эффективно разбивает вашу строку на две переменные.

Оттуда вам требуется математическое и переменное переназначение для изменения массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...