2016-06-29 2 views
3

Я просто даю часть огромного файла XMLКак удалить файл 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> 

Я попытался, как этот

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

Прекрасно работает немного, что я действительно хочу, выводится только тогда, когда caldata chopper="off" и сохранить свой вывод файл. Как это сделать?

+3

использовать XML/HTML парсер (xmllint, XMLStarlet ...). – Cyrus

+0

Насколько велик ваш файл? 100 мб или гб? –

+0

@ vtd-xml-author 96,5kB, не большой! –

ответ

3

Решение состоит в использовании XML grep, такого как xgrep. Я пробовал себя на моей машине и получил это:

$ 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"] - принять все caldata элемент с атрибутом chopper равен off;
  • c1[@unit="Hz"] - из этого caldata элементы, получают c1 элементы с 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". Вторая команда (grep) принимает только строки с нужными вами числами. Третья команда (sed) берет номер из строки.

0

Поскольку вы используете Grep, я буду считать, что какой-то вкус * Никс и типа командной строки решение

В этом случае, вы, вероятно, хотите посмотреть на что-то вроде зорбы, который будет анализировать ваш входной документ с помощью xquery и выведите нужные компоненты.

Если контейнер элемент данных был Foo, то XQuery будет содержать:

for $c in /foo/caldata 
return if ($c/@chopper="on") 
then $c else "" 
Смежные вопросы