ゼロバイトで区切られたレコードファイルがあります。
Record 1, Line 1
Record 1, Line 2
[zero byte]
Record 2, Line 1
Record 2, Line 2
各レコードに対して "process.sh"コマンドを一度実行し、そのレコードを標準入力として使用したいと思います。
bash process-one-record-stdin.sh <record-contents
これを行うには、xargs、パラレル、または他のツールを使用できますか? (Bashスクリプトの使い方を知っていますが、可能であれば組み込みツールを使用することをお勧めします)
やる気
magic-xargs-type-command-here -0 all-records.txt -- xargs -d"\n" -- bash process-one-record-arguments.sh
答え1
GNU Parallelがある場合は、次のことができます。
parallel --rrs --recend '\0' -N1 --pipe bash process-one-record-stdin.sh <record-contents
すべての新しいコンピュータにはマルチコアがありますが、ほとんどのプログラムは本質的にシリアルなので、マルチコアを使用しません。しかし、多くのタスクは非常に並列化可能です。
- 複数のファイルで同じプログラムを実行する
- ファイルの各行に対して同じプログラムを実行します。
- ファイルの各ブロックに対して同じプログラムを実行します。
GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。
4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。
インストールする
ディストリビューションにGNU Parallelがパッケージされていない場合は、rootアクセスなしでプライベートインストールを実行できます。これは10秒で完了できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README
詳細
より多くの例を見る:http://www.gnu.org/software/parallel/man.html
紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel
答え2
xargを使ってこれを行うことはできますか?
xargsの場合、利用可能なオプションは次のとおりです。
--null -0 空白ではなく null 文字でエントリを終了します。
-n max-args コマンドラインごとに最大 max-args 個の引数を使用します。
$ echo -ne "line 111\0000line 222\0000\0000line 333\0000\0000" | \
xargs -I '{}' --null -n 1 bash -c "echo handling this input: '{}'. OK"
handling this input: line 111. OK
handling this input: line 222. OK
handling this input: . OK
handling this input: line 333. OK
handling this input: . OK