2016-03-16 56 views
2

我試圖並行運行此:GNU並行內的Perl命令?

parallel perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' {} > {}.fix ::: * 

也就是說,我想在當前目錄下的所有文件執行perl的命令,在並行。這不起作用,但我不知道爲什麼。

評論:該perl命令在表定影浮點數。見Replacing precision of floating point numbers in existing file

+0

你是什麼意思*「不工作」*? – Borodin

+0

@Borodin我得到這個錯誤:'zsh:1:找不到匹配:s /(S +)/ sprintf(%。1e,)/ ge'。 – becko

+0

@Borodin Zsh的具體問題是什麼?我的命令在Bash中運行正常(不能測試,因爲我沒有在這裏啓用Bash)?我問,因爲你標記了zsh。 – becko

回答

2

在bash你可以做一個功能:在巖組

doit() { 
    perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' "$1" > "$2" 
} 
export -f doit 
parallel doit {} {}.fix ::: * 

導出功能,需要使用一個變量:

doit() { 
    perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' "$1" > "$2" 
} 
PARALLEL_ENV="$(typeset -f doit)" 
parallel doit {} {}.fix ::: * 

或者你可以給perl的表達和重定向(這也將工作在Bash中):

parallel perl -pe \''!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge'\' {} '>' {}.fix ::: * 
+0

因此,該錯誤對zsh特別有用?它會在bash中運行正常嗎? – becko

+0

@becko Zsh解決方案可以在Bash和Zsh中使用。但是如果你不在Bash中使用函數,你需要在那裏引用。 –

+0

所以這不是Bash vs Zsh的問題。你只有兩種可能的解決方案,它們應該可以在兩個shell中工作。也許你應該明確表達。 – becko