с помощью awk удалите ненужные записи с определенными полями

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

BEGIN {
  RS="";
  FS="\n";
}

и вот мой вклад:

   <Row>
    <Cell><Data ss:Type="String">Networks menu (disabled)</Data></Cell>
    <Cell><Data ss:Type="String">Networks</Data></Cell>
    <Cell ss:Index="4"><Data ss:Type="String">Select</Data></Cell>
    <Cell><Data ss:Type="Boolean">0</Data></Cell>
    <Cell><Data ss:Type="String">Back</Data></Cell>
    <Cell ss:Index="8"><Data ss:Type="String" x:Ticked="1">1</Data></Cell>
    <Cell><Data ss:Type="String">&quot;Networks Sel&quot;,&quot;GPRC Mode&quot;</Data></Cell>
    <Cell ss:StyleID="s73"/>
    <Cell ss:StyleID="s73"/>
    <Cell ss:StyleID="s73"/>
   </Row>



   <Row>
    <Cell ss:StyleID="s93"><Data ss:Type="String">New Code?</Data></Cell>
    <Cell ss:StyleID="s62"/>
    <Cell ss:StyleID="s62"/>
    <Cell ss:StyleID="s62"/>
    <Cell ss:StyleID="s62"><Data ss:Type="Boolean">0</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cancel</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="Boolean">0</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String" x:Ticked="1">-1</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">&quot;?|New Code?&quot;</Data></Cell>
    <Cell ss:StyleID="s95"/>
    <Cell ss:StyleID="s95"/>
    <Cell ss:StyleID="s95"/>
   </Row>



   <Row>
    <Cell ss:StyleID="s156"><Data ss:Type="String">New Message Arrived</Data></Cell>
    <Cell ss:Index="3"><Data ss:Type="String">ANIMATION_REC_MAIL</Data></Cell>
    <Cell><Data ss:Type="String">Read</Data></Cell>
    <Cell><Data ss:Type="Boolean">0</Data></Cell>
    <Cell><Data ss:Type="String">Back</Data></Cell>
    <Cell><Data ss:Type="Boolean">0</Data></Cell>
    <Cell ss:StyleID="s117"><Data ss:Type="String">-1</Data></Cell>
    <Cell><Data ss:Type="String">NOT EXIST </Data></Cell>
    <Cell ss:StyleID="s73"/>
    <Cell ss:StyleID="s73"/>
    <Cell ss:StyleID="s73"/>
   </Row>

Как просмотреть все введенные данные, кроме ОДНОЙ записи, в каком втором поле указано «Новый код?» (здесь будет некоторое регулярное выражение)


person Pawel Bala    schedule 05.12.2012    source источник
comment
Хорошо известно, что попытка разобрать/обработать XML с помощью awk и других линейно-ориентированных инструментов приводит к безумию. (Можем ли мы добавить это в DSM?). Было бы правильно переключиться на инструменты, специально предназначенные для работы с XML.   -  person twalberg    schedule 05.12.2012
comment
Awk ориентирован не на строки, а на записи, поэтому обычно легко анализировать XML-файлы с помощью awk. Существует также xmlawk, если ваш файл слишком сложен для ванильной версии.   -  person Ed Morton    schedule 06.12.2012
comment
Когда я стоял перед своей проблемой, я попытался скопировать ее с помощью sed, но я врезался в стену, потому что sed строчно-ориентированный, чем я обнаружил разделители записей в awk, и это было моей эврикой. Подводя итог, я понятия не имел, что всю проблему можно решить с помощью одной строки :)   -  person Pawel Bala    schedule 06.12.2012


Ответы (1)


Если вы хотите оставить пустую строку между записями, вам также необходимо установить переменную ORS. Вы хотите использовать оператор сопоставления awk ~ во втором поле.

awk '
    BEGIN {RS=""; FS="\n"; ORS="\n\n"} 
    $2 ~ /New Code\?/ {next} 
    {print}
'

Как упоминает @EdMorton, это можно написать более кратко:

awk 'BEGIN {RS=""; FS="\n"; ORS="\n\n"} $2 !~ /New Code\?/'
person glenn jackman    schedule 05.12.2012
comment
Вы можете заменить $2 ~ /New Code\?/ {next} {print} только на $2 !~ /New Code\?/. - person Ed Morton; 06.12.2012
comment
Ребята, это оно! Большое спасибо! Какой хитрый однострочник :) но что-то не так с моим awk, первое поле $1 пусто, $2 - это ‹Row›, а $3 - это то, что я хотел, я не понимаю... - person Pawel Bala; 06.12.2012