Pagina 1 di 1
Lavoro per sed/awk
Inviato: mar 19 ott 2010, 15:36
da anycolouryoulike
Devo sostituire in un file determinate linee con altre che si trovano in un altro file.
Nel primo file le linee sono identificabili con una regexp, mentre il secondo contiene solo le righe da sostituire.
Faccio un esempio per capire meglio. Il primo file è così:
Codice: Seleziona tutto
afdsaf
afdfad
afdfa
B adfadfa
adfda
fadsfa
fadsf
B adfafd
Il secondo:
Vorrei ottenere:
Codice: Seleziona tutto
afdsaf
afdfad
afdfa
B prova prova
adfda
fadsfa
fadsf
B ciao ciao
Ho provato con questo:
ma ottengo:
Qualcuno ha idea di come fare in modo semplice?
Grazie
Re: Lavoro per sed/awk
Inviato: mar 19 ott 2010, 16:55
da targzeta
L'algoritmo è corretto, solo che devi stare attento a due cose:
- Il comando 'd' elimina il pattern space e fa ricominciare il ciclo, quindi il tuo comando 'R' non sarà mai eseguito.
- Il comando 'R' prende come argomento il nome del file, ma come fa a sapere quando finisce il nome del file? Generalmente quando arriva il '\n'.
Quindi il tuo script diventerebbe:
Dopo che hai scritto il nome del file premi pure invio, dato che hai inserito un apice prima dell'espressione la shell non invoca il comando ma va a capo ed attende l'altro apice di chiusura.
L'errore era dovuto al fatto che il comando 'R' si prendeva anche la parentesi chiusa come parte del nome del file e quindi, giustamente, sed lamentava l'assenza di una parentesi.
Emanuele
Re: Lavoro per sed/awk
Inviato: mar 19 ott 2010, 17:01
da anycolouryoulike
Si il d poi l'ho cambiato con una z...
Come dici tu comunque è perfetto.
Intuivo che il problema era quello del nome del file, infatti ho provato anche (invano) a quotare la parentesi.
Grazie davvero!
Re: Lavoro per sed/awk
Inviato: mar 19 ott 2010, 21:33
da anycolouryoulike
Ci sarebbe anche un altro lavoretto, che credo sia più comodo fare con awk (che non conosco quasi per niente).
Vorrei dividere quello stesso file in dei file più piccoli, ognuno dei quali termina con la riga che inizia con B.
Qualche idea? Sicuramente non dev'essere difficile.
Grazie
Re: Lavoro per sed/awk
Inviato: mer 20 ott 2010, 7:34
da targzeta
Non ho capito se vuoi sempre fare la sostituzione precedente o no. In questo caso è meglio usare awk perché ogni file ha un nome diverso e quindi serve incrementare una variabile.
Io ho pensato a questa soluzione:
Codice: Seleziona tutto
awk 'BEGIN {i=0} /^B /{getline < "file1"} {print $0 >> "file_tmp" i} /^B /{i++}' file
il codice sopra esegue anche la sostituzione che avevi richiesto all'inizio.
Altrimenti, se non vuoi più sostituire le regex ma solo spezzettare il file:
Codice: Seleziona tutto
awk 'BEGIN {i=0} {print $0 >> "file_tmp" i} /^B /{i++}' file
In entrambi i casi:
- file è il file di input
- file1 è l'eventuale file da cui prendere le stringhe da sostituire alle regex
- file_tmp[0...N] contengono i pezzi di file
Emanuele
Re: Lavoro per sed/awk
Inviato: mer 20 ott 2010, 16:34
da anycolouryoulike
Grazie mille, awk me lo devo proprio studiare...