Search code examples
perlzshgnu-parallel

Perl command inside GNU parallel?


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.


Solution

  • 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 ::: *