Arrays 从另外两个数组中构建一个数组,并显示带有某些特殊条件的值
这是我的数组A=>[index]值:Arrays 从另外两个数组中构建一个数组,并显示带有某些特殊条件的值,arrays,bash,indexing,Arrays,Bash,Indexing,这是我的数组A=>[index]值: [0] 0 [1] 0 [2] 0 [3] 1 [4] 0 [5] 100 [6] 0 [0] 0 [1] 1 [2] 12 [3] 430 [4] 0 [5] 0 [6] 0 [1] 0 1 [2] 0 12 [3] 1 430 [5] 100 0 这是我的数组B=>[index]值: [0] 0 [1] 0 [2] 0 [3] 1 [4] 0 [5] 100 [6] 0 [0] 0 [1] 1 [2] 12 [3] 430 [4] 0 [5] 0
[0] 0
[1] 0
[2] 0
[3] 1
[4] 0
[5] 100
[6] 0
[0] 0
[1] 1
[2] 12
[3] 430
[4] 0
[5] 0
[6] 0
[1] 0 1
[2] 0 12
[3] 1 430
[5] 100 0
这是我的数组B=>[index]值:
[0] 0
[1] 0
[2] 0
[3] 1
[4] 0
[5] 100
[6] 0
[0] 0
[1] 1
[2] 12
[3] 430
[4] 0
[5] 0
[6] 0
[1] 0 1
[2] 0 12
[3] 1 430
[5] 100 0
其目的是将第一个阵列和第二个阵列合并到第三个阵列中,以显示:
不是两个值都为0的对
保留索引值
因此,我的数组C的行为方式是=>[index]值:
[0] 0
[1] 0
[2] 0
[3] 1
[4] 0
[5] 100
[6] 0
[0] 0
[1] 1
[2] 12
[3] 430
[4] 0
[5] 0
[6] 0
[1] 0 1
[2] 0 12
[3] 1 430
[5] 100 0
如何合并并打印此结果?
提前感谢。假设阵列长度相等
a=(0 0 0 1 0 100 0); b=(0 1 12 430 0 0 0)
c=(); for k in "${!a[@]}";
do if [[ "${a[k]}" -ne 0 ]] || [[ "${b[k]}" -ne 0 ]];
then c[k]="${a[k]} ${b[k]}"; fi;
done
for k in "${!c[@]}"; do echo "$k: ${c[$k]}"; done
将打印
1: 0 1
2: 0 12
3: 1 430
5: 100 0
如果我们假设它们的长度相同-
for (( ndx=0; ndx < "${#a[@]}"; ndx++ ))
do if (( a[ndx] || b[ndx] ))
then c[ndx]="${a[ndx]} ${b[ndx]}"
echo "$ndx: ${c[ndx]}"
fi
done
如果你不知道它们是一样的,还是更长-
for (( ndx=0;
ndx < ( ${#a[@]} > ${#b[@]} ? ${#a[@]} : ${#b[@]}) ;
ndx++ ));
do if (( a[ndx] || b[ndx] ))
then c[ndx]="${a[ndx]} ${b[ndx]}"
echo "$ndx: ${c[ndx]}"
fi
done
这会将数组长度与三元运算符进行比较,并选择较长的一个。向我们展示迄今为止的结果。请重新阅读有关创建MCVE的内容。我们将帮助您解决问题,真诚地尝试解决问题;我们不会简单地为您做看起来非常像家庭作业的事情。在shell中使用数组并没有很多有趣的方法,它们并不意味着构建有意义的数据结构;它们是一种保存包含空格的参数列表的方法。无论你能找到什么非常简单的蛮力方法来实现这一点,都可能是实现这一点的方法。示例中的预期输出不符合你对所需行为的描述。你说的只有不等于0的值,并且包括像01和1000这样的对,其中一些值是零。你是说不是两个值都是0的配对?@Socowi:没错,我的英语似乎不如你的好!测试a+b不是都不等于0的值-如果a==1和b==1会怎么样?为True。应该问一下是否可能有负面消息或者分数。谢谢@PaulHodges的回复!这个解决方案也很有效。非常感谢@karakfa您的回答解决了我的问题!