2017-10-03 2 views
1

Ich bewege mich mit gawk, um einige Werte, aber nicht alle Werte aus einer Datei zu erfassen. Ich habe eine andere Datei, die eine Vorlage ist, die ich verwenden werde, um ein bestimmtes Stück zu ersetzen und dann eine Datei zu erzeugen, die für diese Werte spezifisch ist. Ich möchte sed verwenden, um diese Felder von Interesse, die in der Vorlage sind, zu ersetzen.Übernahme von Werten aus einer Datei (über awk) und Verwendung in einer anderen Datei (via sed)

the dog NAME , likes to ACTION in water when he's bored 

eine andere Datei, f1, würde den Namen des Hundes haben und die Aktion

Maxs,swim 
    StoneCold,digs 
    Thor,leaps 

So kann ich diese Werte greifen und sie in ein assoziatives Array speichern ..., was ich kann nicht tun, oder siehe, wie bekomme ich diese zu meinem sed-Skript? so ein einfaches sed-Skript wie dieses so

s/NAME/ value from f1 
s/ACTION/ value from f1 

könnte mein heraus für die Vorlage setzen

the dog Maxs , likes to swim in water when he's bored 

So wäre, wenn ich ein Bash-Datei lief, würde der Befehl wie folgt aussehen, oder Was ich versucht habe

gawk -f f1 animalNameAction | sed -f (is there a way to put something here) template | cat 

     gawk -f f1 animalNameAction > PulledValues| sed -f PulledValues template | cat 

aber nichts davon hat funktioniert. Ich frage mich also, wie das gemacht werden könnte.

Antwort

2

Sie können dies tun, indem awk selbst,

Ich gehe davon aus, Vorlage von mehrzeiligen char sein kann,

  • so in FNR==NR{} Block, ich gesamte Datei (Vorlage) Inhalte in Variable t gespeichert,
  • und in anderen Block, ersetzte ich NAME und ACTION mit ersten und zweiten Feldern von Komma getrennte Datei.

Hier ist Beispiel:

$ cat template 
the dog NAME , likes to ACTION in water when he's bored 

$ cat file 
Maxs,swim 
StoneCold,digs 
Thor,leaps 

$ awk 'FNR==NR{ t = (t ? t RS :"") $0; next}{ s=t; gsub(/NAME/,$1,s); gsub(/ACTION/,$2,s); print s}' template FS=',' file 
the dog Maxs , likes to swim in water when he's bored 
the dog StoneCold , likes to digs in water when he's bored 
the dog Thor , likes to leaps in water when he's bored 

besser Lesbar:

awk 'FNR==NR{ 
       t = (t ? t RS :"") $0; 
       next 
    } 
    { 
     s=t; 
     gsub(/NAME/,$1,s); 
     gsub(/ACTION/,$2,s); 
     print s 
    } 
    ' template FS=',' file 
0

Sie wollen so etwas wie

Ich habe mich gefragt, wie ich die Worte Name sollte und ACTIO N in der Vorlage und dachte, du solltest sie irgendwo markieren. Wie wäre es:

s/^([^,]*),(.*)/the dog \1, likes to \2 in water when he's bored/ 

Jetzt können Sie verwenden

sed -rf template f1 
Verwandte Themen