Извлечение содержимого между тегами, которые имеют подпункту

На будущее вы можете это сделать .. и вы сохраните проблему гигантских файлов с помощью массивов. Каждый раз, когда поле 1 меняет свое значение, массив удаляется.

BEGIN{
    xd=""; 
}
{
    id=$1;

    if (id != xd)
    {
        for (x in arr)
        {
            print x,arr[x];
        }

        delete arr; #Each time the field one changes its value
        xd=id;
    }
    ind="";
    for (i=1; i<3; i++)
    {
        ind=ind $i;
    }
    if (!arr[ind])
    {
        arr[ind]=$3;
    }

}

END {
        for (x in arr)
        {
            print x,arr[x];
        }
}

Вывод:

$ awk -f script.awk file.txt
A1 abc
A2 ttt
B2 ppp
-4
24.01.2019, 21:08
2 ответа

Предполагая, что XML правильно сформирован (в примере отсутствует CustomObjectоткрывающий тег ),

$ xmlstarlet sel -t -c '//businessProcesses[fullName="Customer Support - Port"]' -nl  file.xml
<businessProcesses>
        <fullName>Customer Support - Port</fullName>
        <description>Telecom team use only</description>
        <isActive>true</isActive>
        <values>
            <fullName>New</fullName>
            <default>true</default>
        </values>
        <values>
            <fullName>Open</fullName>
            <default>false</default>
        </values>
    </businessProcesses>

При этом используется XMLStarlet с запросом XPATH, который извлекает копию узла businessProcesses, имеющего дочерний узел fullNameс точным значением Customer Support - Port.

-nlв конце добавляет новую строку к выходным данным.


Не сравнивайте XMLStarlet или любой другой парсер форматов структурированных документов с инструментами для работы с текстом, ориентированными на строку -, такими как sedили awk.

0
28.01.2020, 05:20

Вы можете получить желаемый результат (с дополнительным пробелом )с помощью

awk 'NR==1 || (NR >= 15 && NR <= 26)'

или

sed -n '1p; 15,26p'

Если вы хотите получить лучший ответ, задайте лучший вопрос.

0
28.01.2020, 05:20

Теги

Похожие вопросы