Search code examples
bashcutio-redirectionxargs

Unable to substitute redirection for redundant cat


cat  joined.txt | xargs -t -a <(cut --fields=1 | sort -u | grep -E '\S') -I{} --max-args=1 --max-procs=4 echo "mkdir -p imdb/movies/{}; grep '^{}' joined.txt  > imdb/movies/{}/movies.txt" | bash

The code above works but substituting the redundant cat at the start of the code with a redirection like below doesn't work and leads to a cut input output error.

< joined.txt xargs -t -a <(cut --fields=1 | sort -u | grep -E '\S') -I{} --max-args=1 --max-procs=4 echo "mkdir -p imdb/movies/{}; grep '^{}' joined.txt  > imdb/movies/{}/movies.txt" | bash

Solution

  • In either case, it is the cut command inside the process substitution (and not xargs) that should be reading from joined.txt, so to be completely safe, you should put either the pipe or the input redirection inside the the process substitution. Actually, neither is necessary; cut can just take joined.txt as an argument.

    xargs -t -a <( cat joined.txt | cut ... ) ... | bash
    

    or

    xargs -t -a <( cut -f1 joined.txt | ... ) ... | bash
    

    However, it would be clearest to skip the process substitution altogether, and pipe the output of that pipeline to xargs:

    cut -f joined.txt | sort -u | grep -E '\S' | xargs -t ...