【问题标题】:Pass Every Line of Input as stdin for Invocation of Utility将每一行输入作为标准输入传递以调用实用程序
【发布时间】:2013-08-13 02:03:46
【问题描述】:

我有一个包含有效 xmls 的文件(每行一个),我想在每一行上一个接一个地执行一个实用程序(xpath)。

我尝试了 xargs 但似乎没有选项将行作为标准输入传递:-

% cat <xmls-file> | xargs -p -t -L1 xpath -p "//Path/to/node"

Cannot open file '//Path/to/node' at /System/Library/Perl/Extras/5.12/XML/XPath.pm line 53.

我也尝试过并行 --spreadstdin 但这似乎也不起作用:-

% cat <xmls-file> | parallel --spreadstdin  xpath -p "//Path/to/node"
junk after document element at line 2, column 0, byte 1607

【问题讨论】:

    标签: xpath parallel-processing gnu xargs


    【解决方案1】:

    如果您希望文件的每一行都被拆分并作为实用程序的标准输入

    你可以在 bash shell 中使用 for 循环:

    cat xmls-file | while read line
    do ( echo $f > /tmp/input$$; 
         xpath -p "//Path/to/node" </tmp/input$$
         rm -f /tmp/input$$
    );
    done
    

    $$ 附加进程 ID 号,创建唯一名称

    我假设 xmls-file 在每一行都包含您想要迭代到 $f 的内容,并且您希望它作为命令行的标准输入,而不是作为命令的参数。

    另一方面,您的规范可能不正确,而您可能需要每一行 成为命令的一部分。在这种情况下,请删除 echo 和 rm 行,并将 xpath 命令更改为在文件中需要该行的任何位置包含 $f。

    我没有做太多 XML,所以可能需要编辑 do 命令。

    【讨论】:

    • 谢谢。这似乎很接近,但是循环似乎将我的 xmls 文件拆分为空格而不是换行符。有什么我想念的吗?
    • 现在想想,这可能是个问题。通常与文件名列表一起使用,以空格分隔。
    • 您可以(我认为是双引号)在它们进入文件时引用它们。还有更好的迭代方式。
    • 来自mandrivausers.org/index.php?/topic/… 的替代迭代器是cat FILE | while read line; do echo $line # or whaterver you want to do with the $line variable ; done
    • 是的。这样可行。您可能需要相应地更新您的答案。
    【解决方案2】:

    您与 GNU Parallel 版本非常接近;只缺少-n1:

    cat <xmls-file> | parallel -n1 --spreadstdin  xpath -p "//Path/to/node"
    

    【讨论】:

    • 是的。这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2014-09-27
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多