Моим простым предложением было бы использовать sort
и uniq -c
$ echo '<countryCode>GBR</countryCode>
<countryCode>USA</countryCode>
<countryCode>CAN</countryCode>
<countryCode>CAN</countryCode>
<countryCode>CAN</countryCode>
<countryCode>GBR</countryCode>' | sort | uniq -c
3 <countryCode>CAN</countryCode>
2 <countryCode>GBR</countryCode>
1 <countryCode>USA</countryCode>
, где вы бы указали на выходе вашего grep
вместо echo
.Более надежное решение - использовать XPath.Если ваш XML-файл выглядит как
<countries>
<countryCode>GBR</countryCode>
<countryCode>USA</countryCode>
<countryCode>CAN</countryCode>
<countryCode>CAN</countryCode>
<countryCode>CAN</countryCode>
<countryCode>GBR</countryCode>
</countries>
, тогда вы могли бы использовать:
$ xpath -q -e '/countries/countryCode/text()' countries.xml | sort | uniq -c
3 CAN
2 GBR
1 USA
Я говорю, что он более надежный, потому что использование инструментов, предназначенных для разбора плоского текста, по своей сути неэффективно для работы с XML,В зависимости от контекста исходного XML-файла может лучше работать другой запрос XPath, который будет соответствовать им где угодно:
$ xpath -q -e '//countryCode/text()' countries.xml | sort | uniq -c
3 CAN
2 GBR
1 USA