[Risolto] awk - esecuzione di file_programma

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cant
Prode Principiante
Messaggi: 44
Iscrizione: mercoledì 26 dicembre 2007, 0:20

[Risolto] awk - esecuzione di file_programma

Messaggio da cant »

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.
Ultima modifica di cant il lunedì 18 febbraio 2008, 20:34, modificato 1 volta in totale.
--
Ciao, Piero.
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: awk - esecuzione di file_programma

Messaggio da difesaparcosempione »

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
Avatar utente
cant
Prode Principiante
Messaggi: 44
Iscrizione: mercoledì 26 dicembre 2007, 0:20

Re: awk - esecuzione di file_programma

Messaggio da cant »

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
Grazie per il suggerimento; ho risolto almeno una parte del problema: quella del redirect.
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.
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: awk - esecuzione di file_programma

Messaggio da Ikitt »

cant 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.
togli il BEGIN, in modo che il file contenente il programma legga semplicemente

Codice: Seleziona tutto

{ gsub(...);gsub(...);...;print $0 }
quindi esegui con

Codice: Seleziona tutto

awk -f programma.awk file_source > "file_target"
[edit]
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
[/edit]
Ultima modifica di Ikitt il lunedì 18 febbraio 2008, 20:04, modificato 1 volta in totale.
Avatar utente
cant
Prode Principiante
Messaggi: 44
Iscrizione: mercoledì 26 dicembre 2007, 0:20

[Risolto] Re: awk - esecuzione di file_programma

Messaggio da cant »

Ikitt ha scritto:
togli il BEGIN, in modo che il file contenente il programma legga semplicemente

Codice: Seleziona tutto

{ gsub(...);gsub(...);...;print $0 }
quindi esegui con

Codice: Seleziona tutto

awk -f programma.awk file_source > "file_target"
...
Eureka!! (good)
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! ;D
Grazie.
--
Ciao, Piero.
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: awk - esecuzione di file_programma

Messaggio da difesaparcosempione »

$ 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
è giusto cosi ? vero ?
ciao
:)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti