gnu并联管道sed删除反引号

问题描述:

例如。我有一个TEST.SQLgnu并联管道sed删除反引号

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

你想做什么?除了语法错误,我没有看到你想解决的问题 – hek2mgl

+0

我试图通过使用'parallel --pipe sed'移除'backtick'符号,但它不起作用 –

+0

为什么要使用并行为了那个原因? – hek2mgl

您需要引用命令:

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最大可达1GB/s左右,每个核心约为。所以在一个带有超线程技术的4核(8“内核”)上,我可以达到5 GB/s。

这将通过内核的数量划分的test.sql的大小,并通过该尺寸的实线块至sed

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

GNU并行将缓冲在磁盘上输出,所以这现在可能是限制因子。这或多或少会发生什么:

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。

+0

谢谢,这工作得很好! –