2009-12-31 42 views
14

Tôi có tình huống sau, hai mảng, hãy gọi chúng là A (0 1) và B (1 2), tôi cần kết hợp chúng trong một mảng mới C (0: 1 0: 2 1 : 1 1: 2), các bit mới nhất tôi đã đi lên với là vòng lặp này:Hợp nhất hai mảng trong 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 

Nhưng nó không hoạt động mà cũng như đầu ra tôi có được điều này:

0: : : : 

Trong trường hợp này, đầu ra phải là 0: 1 0: 2 là A = (0) và B = (1 2)

+0

Sử dụng Python thay thế - cách đơn giản! –

+0

một ví dụ sẽ được đánh giá cao :) – f10bit

+0

'python -c 'từ itertools import *; in "" .join (imap (lambda t: "% s:% s"% t, sản phẩm ([0,1], [1,2]))) '' – ephemient

Trả lời

10

Vì Bash hỗ trợ mảng thưa thớt, tốt hơn là lặp qua mảng hơn là sử dụng chỉ mục dựa trên kích thước.

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 

Đầu ra:

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

cảm ơn bạn vì mã ngắn hơn :) – f10bit

4

đây là một cách

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

cảm ơn bạn, hoạt động hoàn hảo :) – f10bit

+1

Vòng lặp 'for' thứ hai nên sử dụng dấu ngoặc kép xung quanh tham chiếu mảng. Điều này bảo tồn không gian đáng kể trong các giá trị mảng. Hãy thử nó với 'a = (" foo bar "" baz quux ")'. Lệnh 'c + =' tương tự cần báo giá trị mới. – tripleee

31

Bạn có thể làm điều đó trong một dòng với:

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

Full dụ:

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/

+0

Điều này cũng hoạt động cho các mảng thưa thớt. – codeforester

+3

Điều này nối hai mảng không phải là những gì OP muốn. –

-1

Tuyên bố một dòng để hợp nhất hai mảng trong bash:

combine=(`echo ${array1[@]}` `echo ${array2[@]}`) 
Các vấn đề liên quan