2012-03-30 9 views
1

ich eine XML-Datei, die eine Reihe von Einträgen wie folgt hat:awk: Pattern-Substitution in einer Datei basierend auf einer Eingabe von einer anderen Datei

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

Was ich tun möchte, ist das Wertfeld in jedem ersetzen Eintrag der Datei durch einen Eintrag der Form „nodoX“, wobei X sollte aus einer zweiten Datei gelesen werden, das eine Liste von Zahlen enthält, zB „file2“ enthält:

4 
8 
67 
52 

In diesem Fall meine verarbeiteten XML-Datei hätte die vorherigen Einträge ersetzen müssen durch:

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

Derzeit mit dem folgenden Befehl awk Ich versuche, aber es funktioniert nicht:

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

Könnte jemand die richtige Art und Weise beraten diese in awk zu erledigen?

Dank

Daniel

Antwort

1

Nun können Sie das tun, mit 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 

Im Allgemeinen liest Ihre Anzahl Dateien in ein indiziertes Array, dann auf jedem (Matching) trajectory Zeilen druckt den Ersatz. Hinweis, dass es Sie scheitern kann, wenn die Anzahl der Zeilen in der Zahlen-Datei kleiner als die Anzahl der nodo Linien ...

0

Dies könnte für Sie arbeiten:

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

Lösung unter

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