然而,尝试并行化 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