gnu parallel pipe sed删除反引号符号

时间:2017-08-07 03:57:58

标签: linux sed gnu-parallel

例如。我有一个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

1 个答案:

答案 0 :(得分:2)

您需要引用命令:

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

或:

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

例如,如果我有一个20GB的sql文件,并行处理比仅使用sed更快吗?

可能不是。 --pipe很慢。它的最大速度约为500 MB / s。但--pipepart每核大约1 GB / s 。因此,对于具有超线程的4核(8"核心"),我可以获得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

如果您不关心订单 - 您只需要完整的行,那么您可以使用save(版本20170822)避免中间两个read--line-buffer:< / p>

# 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。