开发者

Merging two arrays in Bash

I have two arrays A and B. I want to combine them into a new array C, which is their Cartesian product:

A=( 0 1 )
B=( 1 2 )

# Desired output:
C=( 0:1 0:2 1:1 1:2 )

I tried:

   for ((z = 0; z <= ${#A[@]}; z++)); do
     for ((y = 0; y <= ${#B[@]}; y++)); do
    开发者_开发技巧   C[$y + $z]="${A[$z]}:"
       C[$y + $z + 1]="${B[$y]}"
     done
   done

But that outputs:

 0: : : :

I expected 0:1 0:2 for A = ( 0 ) and B = ( 1 2 ).


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/


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


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[*]}))


One line statement to merge two arrays in bash:

combine=( `echo ${array1[@]}` `echo ${array2[@]}` )
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜