gnu 平行管道 sed 删除反引号

gnu parallel pipe sed remove backtick symbol

例如。我有一个test.sql

cat test.sql
INSERT INTO `t_zydx` VALUES 77.2148,

我想将 ` 替换为空

使用 sed 效果很好

sed s/\`//g test.sql
INSERT INTO t_zydx VALUES 77.2148,

但是当我使用平行管时

cat test.sql | parallel --pipe sed s/\`//g

显示

/bin/bash: -c: line 0: unexpected EOF while looking for matching ``'
/bin/bash: -c: line 1: syntax error: unexpected end of file

您需要引用命令:

cat test.sql | parallel -q --pipe sed s/\`//g

或:

cat test.sql | parallel --pipe sed 's/\`//g'

for example, if i have a sql file like 20GB, does parallel process faster than just using sed?

可能不会。 --pipe 很慢。它的最大值约为 500 MB/s。但是 --pipepart 每个核心大约 1 GB/s 。因此,在具有超线程 (8 "cores") 的 4 核上,我可以获得 5 GB/s.

这会将 test.sql 的大小除以核心数,并将该大小的整行块传递给 sed:

parallel --pipepart --block -1 -a test.sql sed 's/\`//g'

GNU Parallel 将缓冲磁盘上的输出,因此这现在可能是限制因素。这或多或少会发生什么:

read test.sql
save processed output to /tmp
read processed output from /tmp
print to stdout

如果您不关心顺序 - 您只想要完整的行,那么您可以使用 --line-buffer 来避免中间的两个 saveread(从版本 20170822 开始) :

# Chop input into one chunk per core
# process chunk
parallel --pipepart --block -1 -a test.sql --line-buffer sed 's/\`//g'

这样可以避免临时存储 20 GB,但只从磁盘读取 20 GB 一次并在标准输出上写入 20 GB。