问题
I am trying to run this in parallel:
parallel perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' {} > {}.fix ::: *
That is, I want to execute the perl command on all files in the current directory, in parallel. This is not working, but I have no idea why.
Comment: The perl command is fixing floating-point numbers in tables. See Replacing precision of floating point numbers in existing file.
回答1:
In Bash you can make a function:
doit() {
perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' "$1" > "$2"
}
export -f doit
parallel doit {} {}.fix ::: *
Exporting functions in Zsh requires using a variable:
doit() {
perl -pe '!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge' "$1" > "$2"
}
PARALLEL_ENV="$(typeset -f doit)"
parallel doit {} {}.fix ::: *
Alternatively you can quote the perl expression and the redirection (which will also work in Bash):
parallel perl -pe \''!/^step/ && s/(\S+)/sprintf("%.2e", $1)/ge'\' {} '>' {}.fix ::: *
来源:https://stackoverflow.com/questions/36032601/perl-command-inside-gnu-parallel