2016-06-29 11 views
3

私はちょうど私がこのXMLファイルをgrepして出力を保存するには?

grep '<c1 unit="Hz"' *.xml | cut -f2 -d">"|cut -f1 -d"<" 

ようにしようとした巨大なXMLファイルの一部

<caldata chopper="on" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)"> 
     <c0 unit="V">0.00000000e+00</c0> 
     <c1 unit="Hz">4.00000000e+04</c1> 
     <c2 unit="V/(nT*Hz)">8.35950000e-06</c2> 
     <c3 unit="deg">-1.17930000e+02</c3> 
    </caldata> 
    <caldata chopper="on" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)"> 
     <c0 unit="V">0.00000000e+00</c0> 
     <c1 unit="Hz">5.55810000e+04</c1> 
     <c2 unit="V/(nT*Hz)">4.43400000e-06</c2> 
     <c3 unit="deg">-1.58280000e+02</c3> 
    </caldata> 
    <caldata chopper="on" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)"> 
     <c0 unit="V">0.00000000e+00</c0> 
     <c1 unit="Hz">6.00000000e+04</c1> 
     <c2 unit="V/(nT*Hz)">3.63180000e-06</c2> 
     <c3 unit="deg">-1.67340000e+02</c3> 
    </caldata> 
    <caldata chopper="off" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)"> 
     <c0 unit="V">0.00000000e+00</c0> 
     <c1 unit="Hz">4.00000000e-01</c1> 
     <c2 unit="V/(nT*Hz)">1.07140000e-02</c2> 
     <c3 unit="deg">1.48080000e+02</c3> 
    </caldata> 
    <caldata chopper="off" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)"> 
     <c0 unit="V">0.00000000e+00</c0> 
     <c1 unit="Hz">5.55800000e-01</c1> 
     <c2 unit="V/(nT*Hz)">1.33250000e-02</c2> 
     <c3 unit="deg">1.39110000e+02</c3> 
    </caldata> 
    <caldata chopper="off" gain_1="0" gain_2="0" gain_3="0" impedance="(0,0)"> 
     <c0 unit="V">0.00000000e+00</c0> 
     <c1 unit="Hz">7.72300000e-01</c1> 
     <c2 unit="V/(nT*Hz)">1.57750000e-02</c2> 
     <c3 unit="deg">1.29560000e+02</c3> 

を与えていることは、私が本当にしたい罰金ビットどの作品が出力されたときにのみ caldata chopper="off" とに私の出力を保存しますファイル。 これを行う方法は?

これがどうなる
+3

XML/HTMLパーサ(xmllint、xmlstarletを...)を使用します。 – Cyrus

+0

ファイルはどれくらい大きいですか? mbまたはgbsの100秒ですか? –

+0

@ vtd-xml-author 96,5kB、それほど大きくない! –

答えて

3

解決策は、xgrepなどのXML grepを使用することです。私は自分のマシン上でそれを自分自身を試してみましたが、これを得た:

$ xgrep -t -x '//caldata[@chopper="off"]/c1[@unit="Hz"]/text()' test.xml 
4.00000000e-01 
5.55800000e-01 
7.72300000e-01 

秘密はXPath式です:

  • //caldata[@chopper="off"] - chopper属性がoffに等しいとすべてcaldata要素を取ります。
  • c1[@unit="Hz"] - そのcaldataの要素から、の要素はunitの属性はHzになります。
  • text() - それらのc1の要素から、テキストコンテンツのみを取得します。

出力ファイルに保存するには、>リダイレクタをシェルから使用します。私達はちょうどコマンドの後にそれを追加し、出力を得るために、ファイルの名前を追加する必要があります。

$ xgrep -t -x '//caldata[@chopper="off"]/c1[@unit="Hz"]/text()' test.xml > output.xml 
$ cat output.xml 
4.00000000e-01 
5.55800000e-01 
7.72300000e-01 

私はあなたが確かに、このようなカスタムツールを使用することができれば知っているが、あなたの場合はありませんそれはあなたの最高の解決策になります。

+0

Obrigado、nordestino!出力をテキストファイルに保存する方法は? –

+0

De nada;)私は出力をファイルに保存する方法を説明する答えを編集しました。 – brandizzi

2

cat file.xml | awk '/chopper="off"/,/calcdata/{print}' | grep 'unit="Hz"' | sed 's/^.*">//;s/<.*$//' 

最初のコマンド(awk)はchopper="off"が含まれている唯一のチャンクを取ります。 2番目のコマンド(grep)は、必要な番号の行だけを受け取ります。 3番目のコマンド(sed)は、その行から番号を受け取ります。

0

あなたはgrepのを使っているので、私は* nixのいくつかの風味と、その場合には、コマンドライン型ソリューション

を前提とするつもりだ、あなたはおそらくこれを解析する、ゾルバのようなものを見てみたいですあなたの入力文書をxqueryで処理し、必要な部分を出力します。

データ内のコンテナ要素がfooだった場合、XQueryが含まれます

for $c in /foo/caldata 
return if ($c/@chopper="on") 
then $c else "" 
関連する問題