Re: cambiare una parte di testo un un grosso file

2015-02-09 Per discussione MaX
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 Romanoromano@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



Re: cambiare una parte di testo un un grosso file

2015-02-08 Per discussione Marco Romano

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



Re: cambiare una parte di testo un un grosso file

2015-02-07 Per discussione Piviul

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

2015-02-07 Per discussione MaX
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