sed を並列化すると、別の出力が提供されます。

sed を並列化すると、別の出力が提供されます。

ただし、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

関連情報