Может ли кто-нибудь помочь мне найти количество случаев xml-тегов, используя awk или sed - PullRequest
0 голосов
/ 22 декабря 2011

Мне нужно написать скрипт, который будет подсчитывать количество тегов xml (скажем, Code) в файле xml, используя скрипт оболочки.XML-файл может быть любого из следующих форматов:

Format #1: 
<Code>value1</Code> <Code>value2</Code>

 Format #2: 
<Code Attr1=va>value1</Code> <Code Attr1=va
Attr2=va>value1</Code>

Format #3: 
<Code>value1</Code><Code>value2</Code> (All Codes can be in
a single line or multiple lines)

Format #4 
   <Code Attr1=va>value1</Code><Code Attr2=va>value1</Code>

Format #5: 
<Cod 
e>Value1</Code
<Code Attr=1> </C
ode>

Короче говоря, XML-файл может иметь любой формат и иметь новые строки в любом месте.Пожалуйста, помогите мне, мне нужно сделать это в ближайшее время ..

Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 22 декабря 2011

Если XML gawk является опцией:

xmlgawk -lxml 'END { print c }
XMLSTARTELEM == "Code" { c++ }
  ' input.xml
0 голосов
/ 22 декабря 2011

Это может (?) Сработать для вас:

sed -n ':a;N;$!ba;s/\n//g;s/<\s*\/[[:alpha:]][[:alnum:]_-]*\s*>/\n&\n/gp' example |
sed -n 's/^<\//</p' | 
sort | 
uniq -c
9 <Code>

Если у вас есть более экзотические имена элементов, вам нужно изменить [[:alpha:]][[:alnum:]_-]* на любое другое.

0 голосов
/ 22 декабря 2011

Регулярные выражения - плохой способ разбора XML, лучше использовать какой-то синтаксический анализатор XML.

Если вы действительно хотите использовать sed / awk / shell / grep и т. Д., Первое, о чем я могу подумать:

 cat tst | xargs | grep -o '<\s*C\s*o\s*d\s*e[^>]*>' | wc -l

Я не очень хорошо знаю awk, но я уверен, что есть awk ninjas, которые могут сделать это более элегантно, чем это.

Он считает только вхождения <Code> (и варианты), но не закрывающий тег, поэтому, если у вас есть (например) 10 <Code> в вашем файле, но только 9 , он вернет 10 а не 9.

В основном:

  • cat tst | xargs кошки 'tst' в оболочку все на одной строке (поэтому мне не нужно беспокоиться о новых строках);
  • grep -o '<\s*C\s*o\s*d\s*e[^>]*>' печатает все совпадения <Code{optional other stuff}>, где вы можете иметь новые строки / пробелы между всеми буквами Code (-o печатает всего совпадений с регулярным выражением, по одному на строку );
  • wc -l считает строки.

Попробуйте каждый бит подряд, чтобы понять, что я имею в виду.

Для меня tst было просто копией того, что у вас есть выше.

[foo@bar ~]$cat tst
Format #1: 
<Code>value1</Code> <Code>value2</Code>

 Format #2: 
<Code Attr1=va>value1</Code> <Code Attr1=va
Attr2=va>value1</Code>

Format #3: 
<Code>value1</Code><Code>value2</Code> (All Codes can be in
a single line or multiple lines)

Format #4 
   <Code Attr1=va>value1</Code><Code Attr2=va>value1</Code>

Format #5: 
<Cod 
e>Value1</Code
<Code Attr=1> </C
ode>

[foo@bar ~]$cat tst | xargs
Format #1: <Code>value1</Code> <Code>value2</Code> Format #2: <Code Attr1=va>value1</Code> <Code Attr1=va Attr2=va>value1</Code> Format #3: <Code>value1</Code><Code>value2</Code> (All Codes can be in a single line or multiple lines) Format #4 <Code Attr1=va>value1</Code><Code Attr2=va>value1</Code> Format #5: <Cod e>Value1</Code <Code Attr=1> </C ode>

[foo@bar ~]$cat tst | xargs | grep -o '<\s*C\s*o\s*d\s*e[^>]*>'
<Code>
<Code>
<Code Attr1=va>
<Code Attr1=va Attr2=va>
<Code>
<Code>
<Code Attr1=va>
<Code Attr2=va>
<Cod e>
<Code Attr=1>

[foo@bar ~]$cat tst | xargs | grep -o '<\s*C\s*o\s*d\s*e[^>]*>' | wc -l
10
0 голосов
/ 22 декабря 2011

Быстрый и грязный способ:

Поскольку у файла xml есть различные типы тегов, вот быстрый и грязный способ получить приближение тегов xml в вашем файле.

awk -v FS="" '
BEGIN{rc=lc=0} 
{for (i=1;i<=NF;i++) if ($i~/</) {lc++} else if ($i~/>/) {rc++}}
END{print "< = "lc " and > = "rc}' xmlfile

Пример файла:

[jaypal:~/Temp] cat xmlfile
Format #1: 
<Code>value1</Code> <Code>value2</Code>

 Format #2: 
<Code Attr1=va>value1</Code> <Code Attr1=va
Attr2=va>value1</Code>

Format #3: 
<Code>value1</Code><Code>value2</Code> (All Codes can be in
a single line or multiple lines)

Format #4 
   <Code Attr1=va>value1</Code><Code Attr2=va>value1</Code>

Format #5: 
<Cod 
e>Value1</Code>
<Code Attr=1> </C
ode>

Исполнение:

[jaypal:~/Temp] awk -v FS="" '
    BEGIN{rc=lc=0} 
    {for (i=1;i<=NF;i++) if ($i~/</) {lc++} else if ($i~/>/) {rc++}}
    END{print "< = "lc " and > = "rc}' xmlfile
< = 20 and > = 20

Теперь у нас есть идея, что есть 20 * < и 20 * >.Таким образом, вы можете иметь приблизительное представление о том, что в вашем файле 10 тегов xml, так как <code> и составляют 1 тег.

Причина, по которой я говорю это как приближение, поскольку в вашем файле может быть > или <, который может не входить в состав xml-тега.Это может быть началом, конечно, не окончательным решением.

0 голосов
/ 22 декабря 2011

Загрузите XML в дерево документа через DOMParser или XMLDOM, в зависимости от ситуации. Затем используйте jQuery $ (xml) .find ("code"), чтобы вернуть массив вхождений. Длина массива дает вам счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...