[Lugge] Re: Ciclo while con scopo locale

  • From: asettico <asettico@xxxxxxxxxxxxxxx>
  • To: lugge@xxxxxxxxxxxxx
  • Date: Fri, 19 Mar 2004 10:14:07 +0100

Posto una soluzione alternativa a quella da me usata fino ad ora.
Mi piace un po' di più, dovrebbe essere un pelino (con la 'P', eh? ;-) ) più performante ed avere meno effetti collaterali.


asettico wrote:

#!/bin/bash

num=0
endtot=0
lentot=0

# script.awk restituisce numero di riga di inizio e fine
# di ogni blocco dati in $1
# In poche parole, l'ambaradan riorganizza i blocchi di dati in $1,
# riconoscendo quando più blocchi sono consecutivi e quindi non
# necessitano di essere trattati singolarmente.
lastres=$(
> script.awk $1 | sort -ns | while read line; do
        let ++num
        start=$(echo "$line" | cut -f 3)
        end=$(echo "$line" | cut -f 4)
        len=$(echo "$line" | cut -f 5)
        if [ $start -eq $(($endtot + 1)) ]; then
            endtot=$end
            let 'lentot += len'
        else
            head -n $endtot $1 | tail -n $lentot >> $2
            endtot=$end
            lentot=$len
        fi
        echo -e "$endtot\t$lentot" > tmp.$$

echo -e "$endtot\t$lentot"


done)

# A questo punto, $endtot e $lentot valgono sempre 0!
# Per ora, me la sono cavata così.
# MA E' UNA SOLUZIONE VERAMENTE TROPPO BECERA, direi proprio un TAPULLO!!!
endtot=$(cat tmp.$$ | cut -f 1)
lentot=$(cat tmp.$$ | cut -f 2)
rm -f tmp.$$

endtot=$(echo "$lastres" | tail -n 1 | cut -f 1) lentot=$(echo "$lastres" | tail -n 1 | cut -f 2)

head -n $endtot $1 | tail -n $lentot >> $2

Qualcuno mi sa suggerire un'alternativa un po' più elegante del tapullo qui utilizzato?

In questo modo, _non_ uso un file temporaneo.
Però, eventuali messaggi da stampare dentro il ciclo vanno mandati su /stderr/ per non inquinare i dati.


Se avete critiche, sono sempre ben accette!
--
asettico (aka Roberto) [http://www.rossomaltese.it/]
GPG fingerprint [ BA20 8C8D 7712 9D9A 57F3  A96A A7BE 905C 1CB9 26BA ]

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS/IT/O d++(-) s:+>: a34 C++$ ULAVH*++$>++++ P+ L+>++++ E--- W++(-) N(++)
o? K-? w(---) !O M@ V@ PS+@ PE- Y? PGP->++ t+++ 5? X++ R tv+ b+ DI(+)
D++(---) G(-)>-- e>++++ h---() r++ y+++*
------END GEEK CODE BLOCK------
========---------- Prima di scrivere in m-list per favore leggi il regolamento http://www.lugge.net/soci/index.php?link=manifesto


Archivio delle e-mail postate in lista http://www.freelists.org/archives/lugge/

Modifica dell'account sulla lista LUGGe http://www.lugge.net/soci/index.php?link=manifesto.htm#list

Other related posts: