I have two arrays A
and B
. How do I combine them into a new array C
, which is their Cartesian product? For example, given:
A=( 0 1 )
B=( 1 2 )
Desired output:
C=( 0:1 0:2 1:1 1:2 )
I have two arrays A
and B
. How do I combine them into a new array C
, which is their Cartesian product? For example, given:
A=( 0 1 )
B=( 1 2 )
Desired output:
C=( 0:1 0:2 1:1 1:2 )
Since Bash supports sparse arrays, it's better to iterate over the array than to use an index based on the size.
a=(0 1); b=(2 3)
i=0
for z in ${a[@]}
do
for y in ${b[@]}
do
c[i++]="$z:$y"
done
done
declare -p c # dump the array
Outputs:
declare -a c='([0]="0:2" [1]="0:3" [2]="1:2" [3]="1:3")'
If you don't care about having duplicates, or maintaining indexes, then you can concatenate the two arrays in one line with:
NEW=("${OLD1[@]}" "${OLD2[@]}")
Full example:
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');
UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}
Credit: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
-n
is in one of the arrays, it is omitted in the merged array. To see this, run the following code: a=(-m -n -o); b=(-p -q -r); c=("${a[@]}" "${b[@]}"); for i in "${c[@]}"; do echo $i; done
. Also, putting it in quotes doesn't help. –
Sheathbill -n
is not an issue of the array concatination. That works as expected. It is missing, because echo
interprets it as an option to not output a newline. –
Cognition Since Bash supports sparse arrays, it's better to iterate over the array than to use an index based on the size.
a=(0 1); b=(2 3)
i=0
for z in ${a[@]}
do
for y in ${b[@]}
do
c[i++]="$z:$y"
done
done
declare -p c # dump the array
Outputs:
declare -a c='([0]="0:2" [1]="0:3" [2]="1:2" [3]="1:3")'
here's one way
a=(0 1)
b=(1 2)
for((i=0;i<${#a[@]};i++));
do
for ((j=0;j<${#b[@]};j++))
do
c+=(${a[i]}:${b[j]});
done
done
for i in ${c[@]}
do
echo $i
done
for
loop should use double quotes around the array reference. This preserves significant spaces in the array values. Try it with a=("foo bar" "baz quux")
. The c+=
assignment similarly needs to quote the new value. –
Ellita Here is how I merged two arrays in Bash:
Example arrays:
AR=(1 2 3)
BR=(4 5 6)
One Liner:
CR=($(echo ${AR[*]}) $(echo ${BR[*]}))
a=("some words" some single words)
b=(one two three "words with spaces")
n=("${a[@]}" "${b[@]}")
You can also just append to one of them with +=
a+=("${b[@]}")
` –
Wish One line statement to merge two arrays in bash:
combine=( `echo ${array1[@]}` `echo ${array2[@]}` )
combine=("${array1[@]}" "${array2[@]}")
. Which is then what Ian Dunn said. –
Hortensehortensia echo
–
Ellita © 2022 - 2024 — McMap. All rights reserved.