【问题标题】:Unable to substitute redirection for redundant cat无法用重定向替代冗余 cat
【发布时间】:2014-12-21 19:42:22
【问题描述】:
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

上面的代码可以工作,但是用下面这样的重定向替换代码开头的冗余 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

【问题讨论】:

    标签: bash cut io-redirection xargs


    【解决方案1】:

    在任何一种情况下,应该从joined.txt读取进程替换中的cut命令(而不是xargs),所以为了完全安全,您应该放置管道或输入重定向在进程替换里面。实际上,两者都不是必需的。 cut 可以将joined.txt 作为参数。

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

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

    但是,最清楚的是完全跳过进程替换,并将该管道的输出通过管道传输到xargs

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

    【讨论】:

    • 我找到问题中提出的解决方案的方式有一段历史。我试图让 grep 命令可以使用joined.txt 的内容。这将使我能够将 xargs 粘贴在产生joined.txt(这是一个400MB 文件)的管道末端。据我所见, grep 之前的 mkdir 阻止了这种情况的发生,你有没有办法做到这一点?
    • 这行不通。 grep 大概想要 joined.txt 的完整内容,但您只会在文件生成时将其中的一部分提供给每个 grep
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多