На будущее вы можете это сделать .. и вы сохраните проблему гигантских файлов с помощью массивов. Каждый раз, когда поле 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
Предполагая, что 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
.
Вы можете получить желаемый результат (с дополнительным пробелом )с помощью
awk 'NR==1 || (NR >= 15 && NR <= 26)'
или
sed -n '1p; 15,26p'
Если вы хотите получить лучший ответ, задайте лучший вопрос.