2

したがって、別のコマンドによって出力されるファイルのリストに相当するものがあり、次のようになります。

http://somewhere.com/foo1.xml.gz
http://somewhere.com/foo2.xml.gz
...

xmlstarletを介して各ファイルでXMLを実行する必要があるので、実行しています... | xargs gzip -d | xmlstarlet ...。ただし、互いに追加されたすべてのxmlドキュメントではなく、gzipに入る行ごとにxmlstarletを1回呼び出す必要があります。compose 'gzip -d' 'xmlstarlet ...'xargsがそれぞれの合成関数に1つの引数を提供するようにすることは可能ですか?

4

4 に答える 4

4

ファイルを読み取って、シェルで各行を個別に処理してみませんか?すなわち

fileList=/path/to/my/xmlFileList.txt
cat ${fileList} \
| while read fName ; do
   gzip -d ${fName} | xmlstartlet > ${fName}.new
done 

これがお役に立てば幸いです。

于 2011-07-23T07:10:03.887 に答える
1

正しい答えはシェルター(+1)によって提案されたものですが、入力がAndrey( URLのリストを生成するa)によって提案された場合、ここにワンライナー「divertimentocommand 」があります:-)

~$ eval $(command | awk '{a=a "wget -O - "$0" | gzip -d | xmlstartlet > $(basename "$0" .gz ).new; " } END {print a}')

入力内の各URLに対して実行するマルチコマンドラインを生成するだけです。結果のコマンドが評価された後wget http://foo.xml.gz | gzip -d | xmlstartlet > $(basenname foo.xml.gz .gz).new

于 2011-07-23T14:15:17.847 に答える
1

GNUParallelを使用する:

cat filelist | parallel 'zcat {} | xmlstarlet >{.}.out'

または、URLのフェッチを含める場合:

cat urls | parallel 'wget -O - {} | zcat | xmlstarlet >{.}.out'

読みやすく、CPUごとにジョブを並行して実行できるという追加の利点があります。詳細については、紹介ビデオをご覧ください:http ://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2011-07-24T00:39:11.130 に答える
0

xmlstarletがファイル名を渡す代わりにstdinを操作できる場合は、次のようにします。

some command | xargs -i -n1 sh -c 'zcat "{}" | xmlstarlet options ...'

xargsオプションは、プレースホルダーを使用してファイル名の移動先を指定-iできることを意味します。xargsが入力から一度に1行だけであることを示すために"{}"使用します。-n 1

于 2011-07-23T17:39:21.660 に答える