并行化 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

这通常是由于双引号引起的。

引用很烦人,所以尝试使用 shell 函数:

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。 (索尔斯克亚和我已经就此说过话了。)

你必须告诉并行你正在传递的是带参数的可执行文件,而不是假设参数是的默认行为由环境变量命名的程序执行的命令SHELL,任意分割成多个片段,片段之间用空格连接在一起。没有这样的选择;最接近的是告诉parallel引用该命令,以便shell最终运行正确的命令。

parallel -a oldfile.txt -k --block $BYTES --pipe-part -q sed 's/\s.*$// ; s/\(.*\)/\L\1/' > newfile.txt

相关内容