将每行输入传递为stdin以调用实用程序

时间:2013-08-12 05:44:43

标签: xpath parallel-processing gnu xargs

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

我尝试了xargs,但似乎似乎没有选择将该行作为stdin传递: -

% 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

2 个答案:

答案 0 :(得分:1)

如果您希望拆分文件的每一行并为实用程序生成stdin

你可以在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的内容,并且你希望它作为命令行的stdin,而不是命令的参数。

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

我没有做太多的XML,因此可能需要编辑do命令。

答案 1 :(得分:1)

你非常接近GNU Parallel版本;只有-n1缺失:

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