Newsgroup: it.comp.os.linux.iniziare
Titolo: Script che legge un byte si e uno no,aiuto?

Ciao a tutti,
mi servirebbe prelevare da un file solo i byte dispari.
Quindi mi servirebbe uno script per la consolle o in perl o quello che 
volete, che legga un file binario byte per byte ed me ne riscriva un'altro 
saltando i byte in posizione pari, ovvero il primo byte lo riscrive uguale,
il secondo lo salta, ovvero va perso... il terzo lo riscrive...ecc.
Il file riscritto avra' una dimensione giusto la meta' del primo.
 
Sono sicuro che in linux basta un semplice script per fare una cosa del 
genere.
 
Ringrazio anticipatamento chi mi aiuta. Grazie
 
Esempio file origine:
abcdefgh123456
 
Esempio file creato:
aceg135


Prova con
 
perl -n0e 's/(.)./$1/g; print' file
 
 
 
-- 
Cio' che si vede, e'.
 

 aceg135
 
Ma vuoi leggere i *byte*, oppure i *caratteri*? Perché c'è una bella 
differenza: se parliamo di *caratteri* dovremmo entrare, a ragionar per 
byte, nel merito del charset utilizzato (che, in casi limite di set 
estesi - tipo UTF16 o 32 - potrebbe essere di 2 o 4 byte per carattere).
 
-- 
Massimo Bacilieri AKA Crononauta

 mi servirebbe prelevare da un file solo i byte dispari.
 
ma se servono, anche i pari...
 
$ echo '123
456
789' | python2 -c 'from sys import stdin ; f = stdin.read(); print f[::2]'
134679
$ echo '123
456
789' | python2 -c 'from sys import stdin ; f = stdin.read(); print f[1::2]'
2
5
8
 
$ 
 
leggo lo stdin in un array di byte "f", di questo stampo solo i byte
dispari o i pari usando la notazione slice [inizio:fine:passo] i cui
default sono [0:ultimo_byte:1] considerando che in python i vettori
vengono indicizzati a partire da 0
 
se invece vuoi i _caratteri_ dispari in ciascuna riga stampati in una
riga a se, la cosa è più spinosa perché bisogna sapere come è
codificato il file
                                                                g
 
NB: i LF in questo esempio sono tutti byte pari

 NB: i LF in questo esempio sono tutti byte pari
 
Dovrei convertire i files di indice di kmail relativi alla posta in 
ingresso, uscita ecc. perche' sono in binario e mi servono come testo per 
darli in pasto ad un estrattore di email, on line.
 
Ho provato ad aprire con kate ad esempio
.kde4/share/apps/kmail/mail/.sent-mail.index
 
ma e' incomprensibile. dove riesco a individuare qualche testo le lettere 
sono staccate da uno spazio tra di loro, che poi analizzandolo meglio non e' 
proprio uno spazio ma ha valore 00. E' normale uno spreco cosi' esagerato di 
byte oppure e' il programma che ho usato a separare i caratteri o la 
codifica?
 

 perl -n0e 's/(.)./$1/g; print' file
 
Ho provato ed ha funzionato egregiamente!!
Ti ringrazio moltissimo!
 
Pero' non capisco perche' il file creato non e' la meta' di quello di 
origine. Va bene lo stesso, tanto a me interessa solo estrapolare il testo 
contenuto (email) nel file binario.
 
file originario
170531 byte
 
File creato
106762


Senza sapere piu' dettagli sui file originali, e' difficile dirlo. Se non
ricordo male da quando lo usavo, kmail usa maildir, quindi dovresti avere un
file per ogni messaggio, e non mi sembra di aver dovuto mai avere a che
fare con file binari.


> 106762
http://www.zsms.eu/images/file2.txt
 
 
Il file2.txt dovebbe essere in teoria la meta di 170531 byte, quindi circa 
85265 byte. Forse i 21500 byte circa in piu' saranno LF, o simili????
Non ci ho capito molto, e non capisco nemmeno cosa faccia 
quell'incomprensibile, ma magico script perl di una sola riga cosi' corta..
...ma a quanto sembra fa proprio quello che mi serviva. Grazie
 
P.S. Quei 2 file che ho messo su internet fra pochi giorni li cancello, per 
sicurezza...

 caratteri o la codifica?
 
Probabile sia la codifica UTF16
 
 

 
 
ho provato con iconv -f UTF16 -t UTF8 file (perche' se lo converto in ASCII 
mi dava errore gia' alla prima posizione)
 
iconv -f UTF16 -t UTF8 file
 
‣䵋楡⵬湉敤⁸ㅖ〵ਸ਼ࠀ砀㑖ࠒ鐀ԀⰀ4rnexAnPfSXV/fOJYz9q8ࡑࠀĀ਀Paol፯Ȁ਀prov㰀
irresis...@messaggiami.ne
Ѵ؀଀㈀1086390419.4166.nNOvm:2,ࠀiconv: illegal 
input sequence at position 278
 
 
Come vedi, il testo me lo ricompone quasi corretto, ma .net lo da sbagliato 
e poi si blocca con l'errore.
 
Per caso ho provato di aprirlo invece che con kate, con un semplice:
 
cat file
 
E me lo da buono a video. Ma se riporto l'output su file, mi esce identico. 
ovviamente...
 
cat file >
file2.cat
 
 
 

 mi dava errore gia' alla prima posizione)
 
Iconv non c'entra, devi solo cambiare il separatore di parole da NULL a 
spazio, esattamente cosi':
 
tr '\000' ' ' < mio_file_mail > nuovo_file_mail
 
oppure se preferisci da NULL a newline ("a capo") cosi':
 
tr '\000' '\n' < mio_file_mail > nuovo_file_mail
 
Nota: alcuni programmi usano il separatore NULL, cioe' l'esadecimale 
0x000, invece dello spazio, esempio anche wc quando gli vuoi dare i
nomi dei file da contare a mezzo d'un elenco scritto, invece che 
immetterli a mano. Il motivo non lo conosco, ma dev'essere roba antica 
degli antichi terminali stupidi, se non delle schede perforate 
addirittura.
 
-- 
Tanti saluti
 

 bla bla bla bla bla
 
Come già ti ho detto, vai sul sito di kmail, ti scarichi tutta la 
documentazione, ti scarichi i sorgenti e vedi cosa hanno fatto,
come lo hanno realizzato e con quale formato.
 
 
 


E' come prendere un caffe'!!!
Ti pare cosa da niente analizzare i sorgenti di kmail?
Io ho gia' risolto il mio problema grazie alla prima risposta di Marco:
 
-------------
perl -n0e 's/(.)./$1/g; print' file
 
Ho provato ed ha funzionato egregiamente!!
Ti ringrazio moltissimo!
----------------
Poi per curiosita' ho solo chiesto questo:
 
-------------------------
Pero' non capisco perche' il file creato non e' la meta' di quello di 
origine. Va bene lo stesso, tanto a me interessa solo estrapolare il testo 
contenuto (email) nel file binario.
 
file originario
170531 byte
 
File creato
106762
---------------------------

 origine.
 
Perché lo script è una pezza a colore? Perché ci sono gli a capo?
ed i fine riga?
