假设我有一个包含n个元素的数组。每个元素都是一串逗号分隔的x,y坐标对,例如"581,284“。这些x,y值没有设置字符长度。
假设我想从每个x值中减去8,从每个y值中减去5。
修改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基本上,我最初读取了坐标对,并从它们中剥离了逗号,然后计划修改填充到新数组中的奇数/偶数值。在这一点上,我意识到必须有一种更有效的方法。
发布于 2020-04-23 13:46:57
我相信以下内容应该能达到你想要的效果:
#!/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[@]}允许我们遍历bash数组的索引。
${value%%,*}和${value##*,}依赖于bash参数替换来分别删除逗号之后或之前的所有内容。这有效地将字符串拆分为两个变量。
从那里开始,就是改变数组所需的数学运算和变量重新赋值。
https://stackoverflow.com/questions/61379919
复制相似问题