Newsgroup: it.comp.os.linux.iniziare
Titolo: Aiuto per uno script

Allora, in una directory ho dei files il cui nome e' un numero, es:
file1: 7654
file2: 9997
file3: 9998
....
fileN: 10017
A me serve trovare il numero piu' basso, il piu' alto e formattarli a
lunghezza 10; nell'esempio sopra:
basso: 7654 -> 0000007654
alto: 10017 -> 0000010017
Il perl non lo conosco, quindi ho provato col bash; pero' non ho idea di
come fare il padding. Una volta messi gli zeri davanti dovrei riuscire a
trovare il piu' basso edi il piu' alto con sort.
Suggerimenti?
Ciao
  Andrea
-- 
Sognatore e' un uomo coi piedi saldamente ancorati sulle nuvole

 come fare il padding.
Beh, dato un numero qualsiasi dovresti riuscire a fare il padding
e a formattarlo in molti modi appoggiandoti al *binario* printf,
che usa la stessa sintassi della funzione C standard omonima.
Il formato non e` IMHO intuitivo, ma con un po` di testardaggine,
man 3 printf (quella del C, il formato e` lo stesso)
info printf
dovresti cavartela.
Prova anche se questo funziona, ho fatto due prove al volo:
printf "%.10i" ${TUO_NUMERO}
Oppure chiedi a qualcuno che conosce il C :)
Ah, casomai non dovresti averla installata, fa parte del pacchetto delle
sh-utils (almeno, su RH e` cosi`...)
-- 
Ikitt e le infinite [o quasi] risorse della CLI

 Oppure chiedi a qualcuno che conosce il C :)
Io conosco il C, nono c'e' problema.


Suggerimenti?
awk
BEGIN { min=0; max=0; }
$1 < min { min = $1; next; }
$1 > max { max = $1; next; } 
END { printf("min %s\tmax %s\n", min, max); }
se proprio ti serve il padding:
BEGIN { min=0; max=0; }
END { printf("min %s\tmax %s\n", min, max); }
$1 < min { min = $1; }
$1 > max { max = $1; } 
{ printf("%010d\n", $1); }
Ancora otto ore di lavoro

 END { printf("min %s\tmax %s\n", min, max); }
Ci siamo quasi, pero' non va: cosi' mi da', per il minimo, sempre 0.
Se invece uso:
{ min=9999999999; max=0; }
non va uguale :(( Sospetto che awk usi gli interi a 32 bit, quindi sia
un problema di overflow o qualcosa del genere.
Altre idee?
Cioe', resta sempre buona l'idea di fare prima il padding di tutti i
numeri e poi ordinarli con sort, ma mi sembra poco elegante.


 
Io, per prima cosa, stabilirei la lunghezza minima e massima dei nomi.
Dovrebbe esserci un'opzione di sort che fa usare l'ordinamento
numerico anzicché alfabetico. Oppure con awk
Poi, se la lunghezza minima è 3 e la massima 5, darei
rename ^ 0 ???
rename ^ 0 ????
rename ^ 00000 ?????
Oppure brutalmente nove righe di rename che aggiungono uno zero
ai nomi di una cifra, a quelli di due, ...a quelli di nove.
ciao, andrea

   Andrea
Scusa il ritardo, quando ti ho risposto da dove stavo lavorando ho avuto
difficolta` a connettermi al server, pensavo sarebbe partito poi la sera
ma a quanto pare ..... :-(
Pero` questo ritardo e` convenuto; vediamo perche`:
- negli esempi che ho fatto ci sono due errori
 
   1) nello stampare i valori min e max bisogna usare *%d* e non _%s_
   2) nell'assegnare il valore minimo la condizione non tiene conto del
      primo record letto,  col risultato che min sara` sempre uguale al
      valore di inizializzazione.
   BEGIN { min=0; max=0; }
   $1 < min  || NR == 1 { min = $1; }
   $1 > max { max = $1; } 
   { printf("%010d\n", $1); }
   END { printf("min %d\tmax %d\n", min, max); }
- soluzione elegante:
[michele]$ touch 1 10 20 154 1654968541 65164 6584
[michele]$ ls | sort -n
1
10
20
154
6584
65164
1654968541
[michele]$ ls \
           | sort -n \
	   | awk 'NR == 1 { print $0; } END { print $0; }'
1
1654968541
modificando  le  istruzioni di  *print*  in  *printf("%010d\n", $0)*  il
risultato diventa:
0000000001
1654968541
ciao
-- 
Mario Michele Macaluso     -o)  | Charlie was a chemist, But Charlie is no   
m.macaluso .@. 
libero.it
   /\\  | more. For what he thought was H2O, Was     
                          _\\_v | H2SO4.                                     
Kernel 2.2.14-5.0 on a i586     |                                            
(All addresses in headers are fake. Only one dot in signature.)