0

私はスクリプトを書きましたが、私がやりたいことは、サブ処理やバックグラウンド処理、または計算を高速化するために必要なものを使用して、可能な限り高速に実行することです。

そのため、スクリプトで & 記号を使用して、可能な限り処理を高速化することを検討していましたが、ここに配置すると、結果がエコーされません。

これは私が書いた関数であり、apon を改善しようとしています。

InTri(){
    while read line
    do
        V1X=$(echo "$line" | awk '{print $1}') &
        V1Z=$(echo "$line" | awk '{print $2}') &
        V2X=$(echo "$line" | awk '{print $3}') &
        V2Z=$(echo "$line" | awk '{print $4}') &
        V3X=$(echo "$line" | awk '{print $5}') &
        V3Z=$(echo "$line" | awk '{print $6}') &
        run=$(echo "$line" | awk '{print $7}') &
        wait
        echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
    done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
}

「man bash」(または理解できるもの)を読みましたが、これが機能しない理由がわかりません。

ヘルプ!:)

どなたでもご参加いただけますので、よろしくお願いいたします。

4

4 に答える 4

2

インラインで発生することはすべて子&プロセスで発生し、親の環境を変更できません。おそらく、パイプを開いて、親プロセスでパイプから読み取る必要があります。あなたの例と同等の実行コストを持つタスクの場合、努力する価値はありません。

この例では、次のことができます

cat <(echo "$line" | awk '{print $1}') <(echo "$line" | awk '{print $1}') ...

このループ本体全体の代わりに。

于 2012-11-20T10:27:15.550 に答える
2

これらの 7 つの awk コマンドが原因でプログラムの速度が低下していると感じる場合は、awk を使用せずに次のようにすることができます。

$ line="1 2 3 4 5 6 7"
$ a=($line)
$ echo ${a[0]}
1
$ echo ${a[1]}
2
$ echo ${a[@]}
1 2 3 4 5 6 7

ここで、「a」は、line 変数のすべての要素を含む配列です。

于 2012-11-20T10:33:30.937 に答える
2

より多くのプロセスを作成すると高速になると考えるかもしれませんが、実際には、新しいプロセスとすべてのパイプを作成するオーバーヘッドのために遅くなる可能性があります。

単に次のことをしないのはなぜですか?

mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);" | awk '{print $1" "$2" "$3" "$4" "$5" "$6" "$7}'

または、それらを変数に読み込みたい場合:

while read V1X V1Z V2X V2Z V3X V3Z run
do
  echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
于 2012-11-20T10:52:28.530 に答える
0

上記のスクリプトを正常に動作させるには、「待機」の前の & を削除する必要がありました。

InTri(){
    while read line
    do
        V1X=$(echo "$line" | awk '{print $1}') &
        V1Z=$(echo "$line" | awk '{print $2}') &
        V2X=$(echo "$line" | awk '{print $3}') &
        V2Z=$(echo "$line" | awk '{print $4}') &
        V3X=$(echo "$line" | awk '{print $5}') &
        V3Z=$(echo "$line" | awk '{print $6}') &
        run=$(echo "$line" | awk '{print $7}') 
        wait
        echo "$V1X $V1Z $V2X $V2Z $V3X $V3Z $run"
    done < <(mysql -u root -ppassword LightCycle -N -e "SELECT V1X, V1Z, V2X, V2Z, V3X, V3Z, ID FROM Temp3 WHERE (V1X <= $x OR V2X <= $x OR V3X <= $x) AND (V1X >= $x OR V2X >= $x OR V3X >= $x) AND (V1Z <= $z OR V2Z <= $z OR V3Z <= $z) AND (V1Z >= $z OR V2Z >= $z OR V3Z >= $z);")
}
于 2012-11-20T11:15:02.200 に答える