ただし、sed操作を並列化しようとすると、並列バージョンが機能しても無効な出力が返されます。
私は並列化されたsed操作が欲しい(動作します)
sed 's/\s.*$// ; s/\(.*\)/\L\1/' < oldfile.txt > newfile.txt
上記のsed操作の並列バージョン(何らかの理由で機能しません):
parallel -a oldfile.txt -k --block $BYTES --pipe-part "sed 's/\s.*$// ; s/\(.*\)/\L\1/'" > newfile.txt
答え1
これは通常二重引用符が原因で発生します。
引用符は迷惑なので、シェル関数を試してみてください。
mysed() {
sed 's/\s.*$// ; s/\(.*\)/\L\1/'
}
export -f mysed
parallel -a oldfile.txt -k --block -1 --pipe-part mysed > newfile.txt
答え2
GNU はシェルで指定したコマンドを並列に呼び出します。ご存知のように、これは時々便利ですが、参照の問題と環境変数への依存性のためにしばしば困難になりますSHELL
。 (ソルシャルと私はこれについて話したことがあります。)
あなたはあなたが通り過ぎるものと並行して話すべきです。パラメータを含む実行可能ファイル、引数がデフォルトの動作であると仮定する代わりに環境変数と名付けられたプログラムによって実行される命令は、SHELL
任意に複数のフラグメントに分割され、フラグメントはスペースで一緒に連結されます。。そのようなオプションはありません。最も近い方法は、シェルが正しいコマンドを実行するようにコマンドを引用するように並列に指示することです。
parallel -a oldfile.txt -k --block $BYTES --pipe-part -q sed 's/\s.*$// ; s/\(.*\)/\L\1/' > newfile.txt