awk: замена шаблона в одном файле на основе ввода из другого файла

У меня есть файл XML с набором таких записей:

<attr name="trajectory" value="nodo2"/>

Что я хочу сделать, так это заменить поле значения в каждой записи файла записью формы «nodoX», где X следует читать из второго файла, содержащего список чисел, например, «file2» содержит:

4
8
67
52

В этом случае мой обработанный файл XML должен был заменить предыдущие записи на:

<attr name="trajectory" value="nodo4"/>
...
<attr name="trajectory" value="nodo8"/>
...
<attr name="trajectory" value="nodo67"/>
...
<attr name="trajectory" value="nodo52"/>
...

В настоящее время я пытаюсь использовать следующую команду awk, но она не работает:

awk '/"trajectory"/ {if (getline < "file2") {x=$1; sub(/"nodo2"/,"\"nodo"x"\"")}}1' $XML_INPUT_FILE > $XML_OUTPUT_FILE

Может ли кто-нибудь посоветовать правильный способ сделать это в awk?

Спасибо

Даниэль


awk
person Dani Camps    schedule 30.03.2012    source источник


Ответы (4)


getline < "file2" перезаписывает $0, поэтому команда sub не будет делать то, что вы хотите. Пытаться:

awk '/"trajectory"/ {if (getline x < "file2") {sub(/"nodo2"/,"\"nodo"x"\"")}}1' 

См. http://www.gnu.org/software/gawk/manual/gawk.html#Getline

person glenn jackman    schedule 30.03.2012

Ну, вы можете сделать это с awk...

awk 'BEGIN { c=1 ; while ((getline line < "OTHER_NUMBERS") > 0) { a[c]=line ; c++ } }
     NR == 1 { c=1 }
     /<attr name="trajectory" value="nodo[0-9]+".>/ {
          print gensub("^(.*=.nodo)[0-9]+(.*)","\\1" a[c] "\\2","g",$0)
          c++
     }
     ! /<attr name="trajectory" value="nodo[0-9]+".>/ { print }' XMLFILE

Как правило, он считывает ваши числовые файлы в индексированный массив, а затем в каждых (совпадающих) trajectory строках печатает замену. Обратите внимание, что это может привести к сбою, если количество строк в файле чисел меньше, чем количество строк nodo...

person Zsolt Botykai    schedule 30.03.2012

Это может сработать для вас:

 awk 'FNR==NR{n[++i]=$1;next};/"trajectory"/{sub(/[0-9]+/,n[++j],$3)}1' file2 XML
person potong    schedule 30.03.2012

решение ниже

awk '
BEGIN{i = 0; while(getline num < "file2"){a[i] = num;i++}}
/"trajectory"/{sub(/nodo2/,"node"a[NR-1], $0);print $0}' file1
person Vishal    schedule 30.03.2012