2017-08-07 25 views
1

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

回答

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最大可達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

謝謝,這工作得很好! –