До сих пор я делал простые вещи в bash с помощью sed, awk, while и т.д.

Что мне нужно сделать дальше, гораздо сложнее, и я не знаю, с чего начать.

У меня есть файл XML, и мне нужно добавить элемент (ы) к нему на основе другой информации в файле XML.

Какие инструменты я должен использовать для достижения этой цели? в то время как циклы, массивы, седь?

  1. Получить список составных идентификаторов и сохранить их в массиве

  2. Для каждого составного идентификатора найдите все отдельные идентификаторы, которые совпадают с составным идентификатором, и сохраните результаты каждого отдельного идентификатора в массиве.

а. Если какой-либо из отдельных идентификаторов имеет положительный тег, создайте новый в XML-файле и установите положительный.

б. Если все отдельные идентификаторы имеют отрицательный тег, создайте новый в XML-файле и установите отрицательный.

Например, это пример того, как будет выглядеть оригинальный XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<waterSample>
    <HeaderInformation>
        <ReportSerialNumber>987754</ReportSerialNumber>
    </HeaderInformation>
    <sample>
        <site>40</site>
        <sampleid>040-2016-12387</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid></compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid>789-879717-001</labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Negative</result>
        <units>10oz</units>
    </sample>
<sample>
        <site>40</site>
        <sampleid>040-2016-12388</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid>78979</compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid>789-879717-002</labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Negative</result>
        <units>10oz</units>
    </sample>
<sample>
        <site>40</site>
        <sampleid>040-2016-12389</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid>78979</compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid>789-879717-003</labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Positive</result>
        <units>10oz</units>
    </sample>
</waterSample>

Вот как будет выглядеть файл после запуска кода:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<waterSample>
    <HeaderInformation>
        <ReportSerialNumber>987754</ReportSerialNumber>
    </HeaderInformation>
    <sample>
        <site>40</site>
        <sampleid>040-2016-12387</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid></compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid>789-879717-001</labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Negative</result>
        <units>10oz</units>
    </sample>
<sample>
        <site>40</site>
        <sampleid>040-2016-12388</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid>78979</compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid>789-879717-002</labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Negative</result>
        <units>10oz</units>
    </sample>
<sample>
        <site>40</site>
        <sampleid>040-2016-12389</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid>78979</compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid>789-879717-003</labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Positive</result>
        <units>10oz</units>
    </sample>
    <sample>
        <site>40</site>
        <sampleid>040-2016-78979</sampleid>
        <productcode>AQUA</productcode>
        <productdescription>10ozAquafina</productdescription>
        <testcode>Oxygen</testcode>
        <testdescription>Test for Oxygen</testdescription>
        <sequence>0</sequence>
        <sampledate>2016-05-27T16:03:00-05:00</sampledate>
        <prefix></prefix>
        <addendum></addendum>
        <compositeid></compositeid>
        <samplename>Water</samplename>
        <sampledescription>Tasty Water</sampledescription>
        <labsampleid></labsampleid>
        <receivedby>John Doe</receivedby>
        <receivetime>2016-05-28T10:49:43-04:00</receivetime>
        <reporttime>2016-05-30T11:30:11-04:00</reporttime>
        <result>Positive</result>
        <units>10oz</units>
    </sample>
</waterSample>

0