【问题标题】:gnu parallel pipe sed remove backtick symbolgnu 平行管道 sed 删除反引号符号
【发布时间】:2018-01-14 07:18:58
【问题描述】:

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

【问题讨论】:

  • 你想做什么?除了语法错误,我没有看到您要解决的问题
  • 我正在尝试使用parallel --pipe sed 删除backtick 符号,但它不起作用
  • 为什么要使用并行?
  • 例如,如果我有一个像 20GB 这样的 sql 文件,并行会比仅使用 sed 更快吗?
  • 您需要对其进行拆分、处理,然后重新加入。我怀疑这对 20G 文件有什么好处。

标签: linux sed gnu-parallel


【解决方案1】:

你需要引用命令:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2011-05-14
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多