Re: cambiare una parte di testo un un grosso file
Grazie a tutti per la collaborazione!
il vincitore indiscusso è sed con l' opzione -f comandi
mi sono fatto una script con 3 funzioni, che agisce su un campione di 1000 linee
La prima funzione usa cat + sed e poi rinomina il file ottenuto --->13.4 secondi
La seconda funzione è simile alla prima ma usa l' opzione -i di "sed",
e quindi sovrascrive direttamente il file
---> 11.2 secondi ... già meglio ma non abbastanza
la terza funzione invece usa i comandi su un file --> 7.6 secondi !!!
****** inizio ciclo cat *********
$ cat file.csv | sed "s|$prima|$dopo|g" > file.csv.tmp
$ mv file.csv.tmp file.csv
------------------------------------------
real 0m13.442s
****** fine ciclo cat *********
****** inizio ciclo I *********
$ cat file.csv | sed -i "s|$prima|$dopo|g" file.csv
---------------------------------------
real 0m11.210s
****** fine ciclo I *********
****** inizio ciclo COM *********
$ sed -f comandi file.csv > file.csv.tmp
$ mv file.csv.tmp file.csv
---------------------------------------------
real 0m7.638s
****** fine ciclo COM *********
ciao e grazie!
MaX
Il 08/02/15, Marco Romano<romano.san@gmail.com> ha scritto:
> On 08/02/15 02:08, MaX wrote:
>> caio a tutti,
>>
>> ho un grosso file csv a cui sto cambiando alcune parti di testo con
>> sed... ma la faccenda tira per le lunghe e i chiedevo se non ci fosse
>> un sistema più veloce.
>>
>> praticamente lo script fa questo:
>>
>> -------------------------------------
>> for A in `cat lista`; do
>> prima=$(echo $A | cut -d ',' -f1)
>> dopo=$(echo $A | cut -d ',' -f2)
>> cat file.csv | sed "s/$prima/$dopo/g" > file.csv.tmp
>> mv file.csv.tmp file.csv
>> done
>> --------------------------------------
>> ...dimenticavo... le parti da cambiare possono essere ripetute in
>> varie parti del file.
>>
>> il file è troppo grande per caricarlo in RAM, al che mi chiedevo se
>> non esistesse un metodo più veloce per ottenere lo stesso risultato.
>>
>> ciao,
>> MaX
>>
>>
> Se il collo di bottiglia si trova nella lettura/scrittura del file,
> forse limitandola ad una volta si riesce ad avere un miglioramento:
>
> #!/bin/bash
>
> : >comandi #creo o riduco a zero la dimensione del file comandi
> while read prima dopo resto; do
> echo "s/$prima/$dopo/g;" >>comandi
> done <lista
>
> sed -f comandi file.csv >file.csv.tmp
> mv file.csv.tmp file.csv
>
> (con l'opzione -i di GNU sed puoi automatizzare la creazione del file
> temporaneo ma non dovrebbe cambiare niente in termini di velocità)
>
> --
> Kind regards,
>
> Marco Romano
>
>
> --
> Per REVOCARE l'iscrizione alla lista, inviare un email a
> debian-italian-REQUEST@lists.debian.org con oggetto "unsubscribe". Per
> problemi inviare un email in INGLESE a listmaster@lists.debian.org
>
> To UNSUBSCRIBE, email to debian-italian-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact
> listmaster@lists.debian.org
> Archive: [🔎] 54D71DD5.90806@gmail.com">https://lists.debian.org/[🔎] 54D71DD5.90806@gmail.com
>
>
--
ciao,
MaX
Reply to: