4

私はプログラムを書いていて、配列に格納されているデータを分割して実行を高速化しようとしています。私はこのようにしようとしています:

    data_to_analyze=(1 2 3 4 5 6 7 8 9 10)
    #original array size
    dataSize=(${#data_to_analyze[@]})

    #half of that size
    let samSmall="$dataSize/2"

    #the other half
    let samSmall2=("$dataSize - $samSmall -1")

    #the first half
    smallArray=("${data_to_analyze[@]:0:$samSmall}")

    #the rest
    smallArray2=("${data_to_analyze[@]:$samSmall:$samSmall2}")

    #an array of names(which correspond to arrays)
    combArray=(smallArray smallArray2)
    sizeComb=(${#combArray[@]})

    #for the length of the new array
    for ((i=0; i<= $sizeComb ; i++)); do
        #through first set of data and then loop back around for the second arrays data? 
        for sample_name in ${combArray[i]}; do
            command
            wait
            command
            wait
        done

私が想像しているのは、最初はデータの最初の配列のみを for ループに渡すことです。最初の配列が完了したら、2 番目の配列セットで再び実行する必要があります。

2 つの質問が残ります。CombArray は本当に 2 つの小さい配列を渡しているのでしょうか? そして、より良い方法はありますか?

4

2 に答える 2

5

配列参照のように見える文字列を作成し、それを使用して、参照された配列の要素に間接的にアクセスできます。スペースを含む要素でも機能します!

combArray=(smallArray smallArray2)
for array in "${combArray[@]}"
do
    indirect=$array[@]    # make a string that sort of looks like an array reference
    for element in "${!indirect}"
    do
        echo "Element: $element"
    done
done
于 2012-07-09T22:35:45.367 に答える
0
#!/bin/bash
data_to_analyze=(1 2 3 4 5 6 7 8 9 10)
dataSize=${#data_to_analyze[@]}
((samSmall=dataSize/2,samSmall2=dataSize-samSmall))
smallArray=("${data_to_analyze[@]:0:$samSmall}")
smallArray2=("${data_to_analyze[@]:$samSmall:$samSmall2}")
combArray=(smallArray smallArray2)
sizeComb=${#combArray[@]}
for ((i=0;i<$sizeComb;i++));do
    eval 'a=("${'${combArray[i]}'[@]}")'
    for sample_name in "${a[@]}";do
        ...
    done 
done

編集: ${combArray[i]} の近くの二重引用符を削除し、<= で < に置き換えました

于 2012-07-10T07:14:50.080 に答える