Newsgroup: it.comp.lang.perl
Titolo: [OT] Programmazione in cshell unix

ciao a tutti,
non credo sia il group più adatto per questa domanda ma non
ne trovo uno specificatamente adatto per la mia richiesta. Spero
di trovare qui qualcuno che sappia rispondere.
Avrei bisogno di una mano per fare uno script in cshell.
Ho bisogno di leggere il contenuto di un file riga per riga
e per ogni riga letta fare una 'grep' su di un altro file per verificarne
l'esistenza.
Spero sia chiaro.
Ciao,
    Ivan

 Spero sia chiaro.
Purtroppo non hai spiegato quello che devi fare ma solo come lo vuoi fare.
Se spieghi meglio cosa ti serve forse č possibile pensare ad un metodo piů
semplice di quello che indichi.
Nel frattempo leggi la man page del comando shell join che probabilmente fa
quello che ti serve.

l'esistenza.
diff potrebbe andare? Magari preceduto da un sort su entrambi (vabbe' che
poi si perde il riferimento del numero di riga...). Non mi viene in mente
altro.
Comunque evita per quanto possibile la cshell, usa la bash.
E in ogni caso il ricorso a qualche utilita' o programma esterno mi pare
sia d'obbligo, perche' un confronto come quello che dici implica la
memorizzazione di una tabella (eventualmente anche piuttosto grande), e non
credo che ci si arrivi con un linguaggio di shell puro. Pero' ho una
conoscenza abbastanza approssimativa di questi linguaggi, sicche' potrei
pure sbagliare.
Per quanto riguarda il gruppo, mi pare esista it.comp.lang, anche se non so
come sia messo; e probabilmente tutti i gruppi su Unix/Linux.
Ciao.

 wrote in message
news:ahr6br$nsn$1...@serv1.iunet.it...



Capito? Casomai 'mi sono spiegato' ... no?
Dovresti leggere la man page di join, comunque puoi fare un sort dei due
file (diciamo file1 e file2) e poi fare join file1 file2 .
Ma perché non puoi usare il perl?

 Capito?
-- 
/federico
[ 
http://www.pixzone.com/dev/
 ]

 for a in `cat file1`; do grep $a $file2; done
ops, scusa un $ di troppo :)
for a in `cat file1`; do grep $a file2; done
-- 
/federico
[ 
http://www.pixzone.com/dev/
 ]

potrebbe andare?
Ma non ti finisce piu'!
Per ogni riga di file1 rilegge dall'inizio alla fine file2. Per andare
immagino anche che vada, porello, ma il tempo necessario diventa
rapidamente spropositato (O(N*M), se non sbaglio).
Ciao.

 ha scritto nel messaggio
news:4qo2ku49p3a1c3rmd...@4ax.com...

E' per questo che proponevo sort + join, così il tempo è O(N log N) anziché
O(N*N)
(ho volutamente semplificato gli ordini di complessità, assumendo che i
files siano di dimensioni simili).

 for a in `cat file1`; do grep $a file2; done
Se file1 contiene 100 linee, e file2 ne contiene altrettante,
e nel caso peggiore in cui il pattern si trova sempre in fondo
a file2, questo "for ... done" deve farsi al più 10000 passaggi.
Due file da 1000 linee ciascuno, ed ecco che hai 1000000 di passaggi
nel caso peggiore.
Consiglio, in caso di file grandi, una lettura di qualche algoritmo
di ricerca un po' più "furbo". Giusto come inizio, per ridurre la
complessità: se sai che un pattern, una volta trovato, non è più
ripetuto, puoi abbassare di molto i tempi...
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)           [ 
http://www.radiance.d2g.com/~zefram
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

ripetuto, puoi abbassare di molto i tempi...
Si potrebbe anche tentare un "poor man hashing": man mano che si legge
file2, si costruisce un albero di directory (meglio non andare oltre il
secondo o terzo livello), organizzando i dati in file distinti.
Qualcosa del genere:
  10
     8
       52
       97
     9
       13
       88
Il file 10/8/97 conterrebbe le righe:
      4-09
      5-04
in 10/9/88 ci sarebbe:
      7-02
e cosi` via.
Naturalmente, sarebbe da pensare bene la suddivisione delle directory, in
modo che la distribuzione sia il piu` possibile bilanciata (non ci siano
pochi file con migliaia di righe e altri quasi vuoti).
Il tutto sempre nell'ipotesi di non avere altro mezzo che la shell per fare
il lavoro: una qualche utilita` o linguaggio che costruisca una tabella hash
"vera" in memoria o su disco resta comunque l'opzione preferibile.
Ciao.