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....@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-requ...@lists.debian.org con oggetto "unsubscribe". Per > problemi inviare un email in INGLESE a listmas...@lists.debian.org > > To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org > with a subject of "unsubscribe". Trouble? Contact > listmas...@lists.debian.org > Archive: https://lists.debian.org/54d71dd5.90...@gmail.com > > -- ciao, MaX -- Per REVOCARE l'iscrizione alla lista, inviare un email a debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per problemi inviare un email in INGLESE a listmas...@lists.debian.org To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: https://lists.debian.org/caeyavmtwkirrds6_ocndmsqs-kug-stvdt8oqqj+2wqiwe0...@mail.gmail.com