Newsgroup: it.comp.os.linux.sys
Titolo: maghi della shell, a me!

Ciao a chi vuole rispondere a questo problema. Ho un file fatto di
milioni di righe cosi':
[…]
chr6 143594871 143594872 1
chr6 143594872 143594873 1
chr6 143594873 143594874 1
chr6 143594874 143594875 1
chr6 143594875 143594876 1
chr6 143594876 143594877 1
chr6 143594877 143594878 1
chr6 143594878 143594879 1
chr6 143594879 143594880 1
chr6 143594880 143594881 1
chr6 143594881 143594882 1
chr6 143594882 143594883 1
chr6 143594883 143594884 1
chr6 143594884 143594885 1
chr6 143594885 143594886 1
chr6 143594886 143594887 1
chr6 143594887 143594888 1
chr6 143594888 143594889 1
chr6 143594889 143594890 1
chr6 143594890 143594891 1
chr7 32904832 32904833 1
chr7 32904833 32904834 1
chr7 32904834 32904835 1
chr7 32904835 32904836 1
chr7 32904836 32904837 1
chr7 32904837 32904838 1
chr7 32904838 32904839 1
chr7 32904839 32904840 1
chr7 32904840 32904841 1
chr7 32904841 32904842 1
chr7 32904842 32904843 1
chr7 32904843 32904844 1
chr7 32904844 32904845 1
chr7 32904845 32904846 1
chr7 32904846 32904847 1
chr7 32904847 32904848 1
chr7 32904848 32904849 1
chr7 32904849 32904850 1
chr7 32904850 32904851 1
chr7 32904851 32904852 1
[…]
chr9 51096373 51096374 18
chr9 51096374 51096375 19
chr9 51096375 51096376 19
chr9 51096376 51096377 22
chr9 51096377 51096378 22
chr9 51096378 51096379 31
chr9 51096379 51096380 31
chr9 51096380 51096381 160
chr9 51096381 51096382 12749
chr9 51096382 51096383 2011853
[…]
(roba di biologia, ma non importa). 
le colonne sono
flag start end num
della flag non importa per ora. start ed end sono due posizioni, num e'
un valore quantitativo. Quello che vorrei fare e' fare dei bin basandomi
sulle posizioni in modo che in output ci sia
flag start start+10 m(num)
ovvero fare dei bin di dimensione 10 (o qualunque altro motivo) il cui
valore sia la media dei 10 originali. Siccome il file e' in realta'
l'output di altri comandi sarebbe bello poter fare il tutto in pipe a
questi.
grassie!
d

 questi.
non si è capito molto di cosa vuoi fare... vuoi fare la media di 10
valori alla volta?
Se è così, fai in awk qualcosa del genere:
#!/usr/bin/awk -f
{
m = 0;
for (i=0; i<10; i++) {
   m = m + $3;
   next;
   }
print $1 " " $2 " " m;
}
Salvi questo come "elab.awk" e gli dai il flag di eseguibilità,
dopodiché lo puoi utilizzare nel pipe come un comando.
(varicomandi) | /path/to/elab.awk | (altripipe)
-- 
Massimo Bacilieri AKA Crononauta

 }
Dimenticavo: occhio a quel "next". Ho avuto modo di vedere che diverse
implementazioni di awk (mawk o gawk, per dirne due) reagiscono in modo
diverso. "next" va bene in gawk, ma in mawk non funziona, dovrai mettere
"continue" o "getline", verosimilmente.


 Quello che vorrei fare e' fare dei bin
Non so cos'è un bin, ma non ti conviene buttare tutto in un database?
Y.

 ovvero fare dei bin di dimensione 10 (o qualunque altro motivo)
eh?

 valori alla volta?
Si, non mi sono spiegato benissimo :-) Cmq era esattamente questo... Ora
provo il codicillo che mi hai suggerito!
d

 provo il codicillo che mi hai suggerito!
io ti quoto il consiglio di yossarian, butta tutto in un db, le medie di 
10 valori alla volta le fai un fase di select, o le fai fare ad uno 
script (da inserire in una seconda tabella) periodicamente

 "continue" o "getline", verosimilmente.
Ho fatto qualche piccola modifica, giusto per assicurarmi che a flag
diverse ripartisse da zero ed altre cosette. Grazie mille
d 

 script (da inserire in una seconda tabella) periodicamente
Come è vario il mondo!
Io avrei scritto quattro righe in C senza scomodare un database.
Roba da Informatica1 ma qui sarebbe OT.

 script (da inserire in una seconda tabella) periodicamente
Non ti chiederò mai un'insetticida... tu mi suggerisci una bomba al
napalm! :-p


 Io avrei scritto quattro righe in C senza scomodare un database.
4 righe le avresti scritte in python o perl, in C ne servirebbero almeno 
40!

 napalm! :-p
rotfl, consigliavo il db non per la difficoltà dell'algoritmo da 
implemengtare quanto eprchè lui parla di "milioni" righe...

 implemengtare quanto eprch� lui parla di "milioni" righe...
Purtroppo il db non so se sia una buona scelta nel mio caso. Mi ritrovo
a dover convertire dell'informazione in un formato specifico in un altro
formato specifico, se passo per db dovrei caricare l'informazione di
partenza nel db per poi processarla...
d

 partenza nel db per poi processarla...
A qualsiasi BOHF bastava traguardare o sogguardare anche di sbieco
l'input
e avrebbe incominciato a digitare
$ awk ...

 A qualsiasi BOHF bastava traguardare o sogguardare anche di sbieco
                    ---------
imperdonabile typo, sarebbe dovuto essere BOFH

 $ awk ...
E infatti e' cosi' che s'e' risolta... :-)
d

 }
Forse ci va una "getline" e un "m/10" da qualche parte? Il codice sopra 
semplicemente somma $3 10 volte e lo mette in m, il tutto per ogni riga.
(o forse sono io che non ho capito il problema)

 semplicemente somma $3 10 volte e lo mette in m, il tutto per ogni riga.
Ah, e non dovrebbe essere $4 anziche' $3?

antani wrote:

Anzi, mi era anche sfuggito il "next". Quel codice non stampa nulla.


Facebook: Massimo Bacilieri

 In mawk ci sarebbe voluto getline.
Getline e next funzionano esattamente allo stesso modo in gawk e mawk (e 
anche altri awk). L'unico che forse potrebbe avere problemi e' l'awk di 
default di Solaris, ma perche' e' antico e non dovrebbe essere comunque 
usato.

 Getline e next funzionano esattamente allo stesso modo in gawk e mawk 
No. Verificato di persona. Ho un bel po' di script in gawk che una volta
ho buttato su un server che aveva mawk di default, e gli script non
facevano quello che dovevano.
Quando mi sono accorto della cosa, ho sostituito mawk con gawk e tutto
ha ripreso a funzionare correttamente.


 ha ripreso a funzionare correttamente.
Da questa descrizione non vedo come si possa dedurre che la colpa fosse di 
getline o next, e senza vedere il codice e' ancora piu' difficile.
Io ho letteralmente centinaia di script che girano sotto gawk e mawk (che 
usano getline e next) e ho zero problemi. Ma se hai verificato di persona...

 Mangiato pesante, coda di paglia o entrambe le cose?
Sto invecchiando. Una volta i troll li identificavo piï¿œ rapidamente.


 dopo 10 righe lette esce dal for e stampa il tutto.
Infatti. Alla fine ho un codicillo un po' diverso ma mi e' servito come
stimolo per scrivermelo in maniera funzionante. 
Grazie
d

 Sto invecchiando. Una volta i troll li identificavo più rapidamente.
ROFL, si', identificarli prima ti aiuterebbe a non impelagarti in 
discussioni scomode. In bocca al lupo.