AWK: quotes in system commando

Pagina: 1
Acties:

  • Diotoir
  • Registratie: Januari 2002
  • Laatst online: 15-02 17:10
Ik probeer met awk een ander programma aan te sturen,
ik had in de AWK user guide gevonden dat dit kan met het
system commando.
Nu is het probleem dat ik quotes moet gebruiken met bij
het aansturen van dat programma, en dat wil niet lukken.

Ik heb de mogenlijkheden die in de awk user guide bij
"Shell-Quoting Issues" staan genoemd geprobeerd.

test programma:
code:
1
2
awk 'BEGIN { system("echo bla \"bla\"") }'
awk 'BEGIN { system(\"echo bla "bla"\") }'


resultaat
code:
1
2
bla bla
awk: line 1: runaway string constant "\") } ...


Wie heeft er een oplossing voor dit probleem?

  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:50
Volgens mij kun je beter vermijden om system aan te roepen vanuit een awk-script dat je op de commandline opgeeft (is het niet anders op te lossen?), maar dit lijkt te werken:

code:
1
awk 'BEGIN { system("echo bla \\\"bla\\\"") }'


Het idee is dat de eerste 'ronde' vervangen wordt gedaan door bash bij het uitvoeren, zodat het commando dat uiteindelijk door system wordt uitgevoerd is: echo bla \"bla\".

  • Diotoir
  • Registratie: Januari 2002
  • Laatst online: 15-02 17:10
Het werkt

Dat het geen mooie oplossing zou worden wist ik, maar kon geen andere oplossing verzinnen.
Ik moet aan het programma het 5de veld en veld 6 en verder tussen quotes meegeven aan dat programma. En dan nog maar van een gedeelte van de records in die file, te herkennen aan veld 1-4.
Als het ging om 1 veld per record dat doorgegeven moest worden. dan had ik ze in een string gezet en daarna buiten awk met een loop langsgelopen.

Dus als iemand een mooiere oplossing weet, hou ik me aanbevolen.

[ Voor 17% gewijzigd door Diotoir op 03-05-2004 19:30 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:50
code:
1
2
3
4
5
6
7
#!/bin/bash

while read line; do
  if [ logica om te checken of de eerste vier velden matchen ]; then
    programma `echo $line | awk '{printf "\"%s %s\"\n", $5, $6}'`
  fi
done <invoerfile


Of iets dergelijks?

Niet echt veel mooier, moet ik toegeven.

[ Voor 14% gewijzigd door Wilke op 03-05-2004 19:44 ]