したがって、私はすべてのN行を並列に正常に読み込み、各行でコマンドを実行する方法をすでに知っています。
while read -r i && read -r a && read -r b && read -r c && read -r d && read -r e && read -r f && read -r g && read -r h && read -r j && read -r k && read -r l && read -r m && read -r n && read -r o && read -r p && read -r q && read -r r && read -r s && read -r t && read -r u && read -r v && read -r w && read -r x && read -r z && read -r aa && read -r bb && read -r cc && read -r dd && read -r ee && read -r ff && read -r gg && read -r hh && read -r ii && read -r jj; do
dosomething "$i" &
dosomething "$a" &
dosomething "$b" &
dosomething "$c" &
dosomething "$d" &
dosomething "$e" &
dosomething "$f" &
dosomething "$g" &
dosomething "$h" &
dosomething "$j" &
dosomething "$k" &
dosomething "$l" &
dosomething "$m" &
dosomething "$n" &
dosomething "$o" &
dosomething "$p" &
dosomething "$q" &
dosomething "$r" &
dosomething "$s" &
dosomething "$t" &
dosomething "$u" &
dosomething "$v" &
dosomething "$w" &
dosomething "$x" &
dosomething "$z" &
dosomething "$aa" &
dosomething "$bb" &
dosomething "$cc" &
dosomething "$dd" &
dosomething "$ee" &
dosomething "$ff" &
dosomething "$gg" &
dosomething "$hh" &
dosomething "$ii" &
dosomething "$jj" &
wait
done < somefile
これは、特定の行(横にある変数として表示)を処理するサンプル関数/アプリケーションdosomething
です。something
本質的にこれはうまくいきます。配列を使用してこれをより良くしたり見やすくしたりしていますが、配列を使用するようにフォーマットする方法がわかりません...
N個のジョブの変数名を生成します($ 1などの一般的な番号付き変数に問題が発生する可能性があるため、アルファだけで数字はありません)。
混乱を防ぐために、上記のスクリプトの各読み取りは「1行」を実行するため、各読み取り= 1行です。これは、繰り返すたびにXの1行を読み取ることを意味します。各反復が完了したら、wait
すべての操作が完了するまで待ちます。
例:
- これ答えは、2つのファイルから同時に2行(1行に1行)を読み取ることを除いて、私がやっているのと同じようなことをします。より多くの機能があります。
PS:または他のものを使うと良いことがわかりますが、parallel
可能であればxargs
bash / POSIXを使用する方が良いでしょう。
どんな意見でも感謝します。
答え1
配列を使用しませんが、待機時間を決定するためにカウンタを保持します。
count=0
while read -r line; do
dosomething "$line" &
((++count % 35 == 0)) && wait
done < file
しかし、この変数が好きではありませんかy
?
コードに大きな問題があります。 35行すべてを正常に読み取る必要がありますdosomething
。ファイルの処理中に読み取りを試みましたが、EOFに達したとしましょう。a
ゼロ以外の値が返され、while条件が失敗し、処理なしでループが中断されます。b
c
read
$a
$b
配列の使用は簡単ではありません。
mapfile -t lines < file
len=${#lines[@]}
i=0
while ((i < len)); do
for _ in {1..35}; do
dosomething "${lines[i]}" &
((i++))
((i == len)) && break
done
wait
done