[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: