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
答
您需要引用命令:
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版)避免了中间的两个save
和read
:
# 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
谢谢,这工作得很好! –
你想做什么?除了语法错误,我没有看到你想解决的问题 – hek2mgl
我试图通过使用'parallel --pipe sed'移除'backtick'符号,但它不起作用 –
为什么要使用并行为了那个原因? – hek2mgl