[Risolto] awk - esecuzione di file_programma
[Risolto] awk - esecuzione di file_programma
Dopo lunghe ricerche, studio del manuale (evidentemente non a sufficenza), sono riuscito a manipolare come volevo un file di testo con il seguente comando:
~$ awk ' { gsub(...); gsub(....);....; print $0}' file_source > file_target
Quello che non riesco a fare è lanciare un programma.awk contenente le stesse istruzioni date nella linea di comando.
Ho provato con la sostituzione più ovvia, per me, scrivendo il seguente file:
BEGIN { gsub(...);gsub(...);...;print $0 }
scrivendolo su un'unica riga, come sopra o su più righe (con o senza "\" alla fine di ogni riga) e lanciando il programma da linea di comando con:
~ $ awk -f programma.awk file_source > "file_target"
oppure mettendo il redirect nel programma.
Risultato: o errore di sintassi se il redirect è nel programma, o file_target vuoto in assenza di errori.
Come "traduco" quel comando diretto in un programma, senza doverlo riscriverlo ogni volta?
Non ho provato, ma presumo che se scrivo uno script contenente il comando awk...., e lo rendo eseguibile, otterrei lo stesso risultato; visto però che è prevista l'opzione -f, vorrei imparare ad usarla.
Grazie.
~$ awk ' { gsub(...); gsub(....);....; print $0}' file_source > file_target
Quello che non riesco a fare è lanciare un programma.awk contenente le stesse istruzioni date nella linea di comando.
Ho provato con la sostituzione più ovvia, per me, scrivendo il seguente file:
BEGIN { gsub(...);gsub(...);...;print $0 }
scrivendolo su un'unica riga, come sopra o su più righe (con o senza "\" alla fine di ogni riga) e lanciando il programma da linea di comando con:
~ $ awk -f programma.awk file_source > "file_target"
oppure mettendo il redirect nel programma.
Risultato: o errore di sintassi se il redirect è nel programma, o file_target vuoto in assenza di errori.
Come "traduco" quel comando diretto in un programma, senza doverlo riscriverlo ogni volta?
Non ho provato, ma presumo che se scrivo uno script contenente il comando awk...., e lo rendo eseguibile, otterrei lo stesso risultato; visto però che è prevista l'opzione -f, vorrei imparare ad usarla.
Grazie.
Ultima modifica di cant il lunedì 18 febbraio 2008, 20:34, modificato 1 volta in totale.
--
Ciao, Piero.
Ciao, Piero.
- difesaparcosempione
- Rampante Reduce

- Messaggi: 6031
- Iscrizione: giovedì 27 luglio 2006, 19:06
- Località: Torino
- Contatti:
Re: awk - esecuzione di file_programma
sono abbastanza arrugginito su awk ...
però usando la sintassi file, mi sembra di ricordare che i parametri di ingresso vengano acceduti da ARGC e ARGV ..
ti metto un link ..
http://www.gnu.org/software/gawk/manual/gawk.html#ARGC-and-ARGV
il manuale manco a dirselo è
http://www.gnu.org/software/gawk/manual/gawk.html
ciao
però usando la sintassi file, mi sembra di ricordare che i parametri di ingresso vengano acceduti da ARGC e ARGV ..
ti metto un link ..
http://www.gnu.org/software/gawk/manual/gawk.html#ARGC-and-ARGV
il manuale manco a dirselo è
http://www.gnu.org/software/gawk/manual/gawk.html
ciao
Re: awk - esecuzione di file_programma
Grazie per il suggerimento; ho risolto almeno una parte del problema: quella del redirect.difesaparcosempione ha scritto: sono abbastanza arrugginito su awk ...
però usando la sintassi file, mi sembra di ricordare che i parametri di ingresso vengano acceduti da ARGC e ARGV ..
ti metto un link ..
http://www.gnu.org/software/gawk/manual/gawk.html#ARGC-and-ARGV
il manuale manco a dirselo è
http://www.gnu.org/software/gawk/manual/gawk.html
ciao
Scrivendo sulla riga di comando:
~$ awk -f kml2csv.awk source.txt target.txt
e, nel programma, :
BEGIN {
gsub(/\t/, "")
...
gsub(/>/, ">;")
...
print $0 > ARGV[2]
print ARGV[0],ARGV[1],ARGV[2] >> ARGV[2]
}
riesco a scrivere sul target.txt i tre ARGV.
Però, tutto il corpo del programma, a parte la print $0 non viene eseguito, o meglio, viene eseguito, ma non legge affatto da source.txt; infatti la print scrive una stringa nulla, tant'è che la seconda print non appende, ma sovrascrive. Se commento la prima print, allora la seconda appende correttamente.
Quindi, il problema è che il programma non legge il file di input!
Ribadisco che, se le stesse istruzioni le scrivo direttamente sulla shell, tutto funziona regolarmente.
Come si risolve?
--
Ciao, Piero.
Ciao, Piero.
Re: awk - esecuzione di file_programma
togli il BEGIN, in modo che il file contenente il programma legga semplicementecant ha scritto: BEGIN { gsub(...);gsub(...);...;print $0 }
scrivendolo su un'unica riga, come sopra o su più righe (con o senza "" alla fine di ogni riga) e lanciando il programma da linea di comando con:
~ $ awk -f programma.awk file_source > "file_target"
oppure mettendo il redirect nel programma.
Codice: Seleziona tutto
{ gsub(...);gsub(...);...;print $0 }
Codice: Seleziona tutto
awk -f programma.awk file_source > "file_target"
demo:
Codice: Seleziona tutto
$ awk -F: -f sample.awk /etc/passwd > /tmp/1
$ cat sample.awk
{ printf "%s->%s\n", $1, $3 }
$ awk -F: '{ printf "%s->%s\n", $1, $3 }' /etc/passwd > 2
$ md5sum /tmp/1 /tmp/2
975b63de6714e2977a5c3b0a402c35d9 /tmp/1
975b63de6714e2977a5c3b0a402c35d9 /tmp/2
Ultima modifica di Ikitt il lunedì 18 febbraio 2008, 20:04, modificato 1 volta in totale.
[Risolto] Re: awk - esecuzione di file_programma
Eureka!! (good)Ikitt ha scritto:
togli il BEGIN, in modo che il file contenente il programma legga semplicementequindi esegui conCodice: Seleziona tutto
{ gsub(...);gsub(...);...;print $0 }...Codice: Seleziona tutto
awk -f programma.awk file_source > "file_target"
Stavo leggendo disperatamente le pagine del manuale, riguardanti BEGIN, END e getline, rendendomi conto che il problema stava lì, ma non riuscivo a trovare la soluzione.
Poi ho dato un'occhiata qui per vedere se c'era qualche risposta....
Ti eleggo a mio tutor personale!
Grazie.
--
Ciao, Piero.
Ciao, Piero.
- difesaparcosempione
- Rampante Reduce

- Messaggi: 6031
- Iscrizione: giovedì 27 luglio 2006, 19:06
- Località: Torino
- Contatti:
Re: awk - esecuzione di file_programma
è giusto cosi ? vero ?$ awk -F: -f sample.awk /etc/passwd > /tmp/1
$ cat sample.awk
{ printf "%s->%s\n", $1, $3 }
$ awk -F: '{ printf "%s->%s\n", $1, $3 }' /etc/passwd > /tmp/2
$ md5sum /tmp/1 /tmp/2
975b63de6714e2977a5c3b0a402c35d9 /tmp/1
975b63de6714e2977a5c3b0a402c35d9 /tmp/2
ciao
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti
