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 -- real0m13.442s ** fine ciclo cat * ** inizio ciclo I * $ cat file.csv | sed -i "s|$prima|$dopo|g" file.csv --- real0m11.210s ** fine ciclo I * ** inizio ciclo COM * $ sed -f comandi file.csv > file.csv.tmp $ mv file.csv.tmp file.csv - real0m7.638s ** fine ciclo COM * ciao e grazie! MaX Il 08/02/15, Marco Romano 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 > 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
Re: cambiare una parte di testo un un grosso file
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 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
Re: cambiare una parte di testo un un grosso file
Il 08/02/2015 02:08, MaX ha scritto: 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. non so, non so se ne aumenti le prestazioni ma hai provato con sed "s/$prima/$dopo/g" file.csv > file.csv.tmp al posto di cat file.csv | sed "s/$prima/$dopo/g" > file.csv.tmp Piviul -- 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/54d7004f.9070...@riminilug.it
cambiare una parte di testo un un grosso file
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 -- 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/CAEyAVmswcOTzmio-Oh=hhjwha1d-m3co7uuhpcu0rc0jc...@mail.gmail.com