2009-12-31 10 views
14

Tengo la siguiente situación, dos matrices, llamémoslas A (0 1) y B (1 2), necesito combinarlas en una nueva matriz C (0: 1 0: 2 1 : 1 1: 2), el último bit i he llegado con este bucle es:Fusionando dos matrices en Bash

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 

Pero esto no funciona tan bien, como la salida me sale esto:

0: : : : 

En este caso, la salida debería ser 0: 1 0: 2 como A = (0) y B = (1 2)

+0

uso de Python en lugar de - manera más sencilla! –

+0

un ejemplo sería muy apreciado :) – f10bit

+0

'python -c 'from itertools import *; print "" .join (imap (lambda t: "% s:% s"% t, producto ([0,1], [1,2]))) '' – ephemient

Respuesta

10

Dado que Bash admite matrices dispersas, es mejor iterar sobre la matriz que usar un índice basado en el tamaño.

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 

Salidas:

declare -a c='([0]="0:2" [1]="0:3" [2]="1:2" [3]="1:3")' 
+0

gracias también por el código más corto :) – f10bit

4

aquí hay una manera

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 
+0

gracias, funciona perfecto :) – f10bit

+1

El segundo bucle 'for' debe usar comillas dobles alrededor de la matriz de referencia. Esto conserva espacios significativos en los valores de la matriz. Pruébalo con 'a = (" foo bar "" baz quux ")'. La asignación 'c + =' de manera similar necesita citar el nuevo valor. – tripleee

31

usted puede hacerlo en una línea con:

NEW=("${OLD1[@]}" "${OLD2[@]}") 

ejemplo completo:

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); 
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); 
UnixShell=("${Unix[@]}" "${Shell[@]}") 
echo ${UnixShell[@]} 
echo ${#UnixShell[@]} 

Crédito: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

declaración
+0

Esto también funciona para las matrices dispersas. – codeforester

+3

Esto concatena las dos matrices, que no es lo que quiere el OP. –

-1

Una línea para combinar dos matrices en bash:

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