Difference between revisions of "Esercizio 3, prova pratica 13/09/2013"
Jump to navigation
Jump to search
(Created page with "Consegna([http://www.cs.unibo.it/~renzo/so/pratiche/2013.09.13.pdf]): <source lang="text"> Sia data una directory che contiene file di testo. Scopo dell'esercizio e' di contar...") |
|||
(One intermediate revision by one other user not shown) | |||
Line 21: | Line 21: | ||
count=1 #conta il numero di riga che sto considerando | count=1 #conta il numero di riga che sto considerando | ||
bool=1 #resta 1 finchè ci sono righe da contare in qualche file | bool=1 #resta 1 finchè ci sono righe da contare in qualche file | ||
+ | if [[ -n $1 ]]; then | ||
+ | cd $1 | ||
+ | else | ||
+ | exit 1 | ||
+ | fi | ||
file=`ls` | file=`ls` | ||
Line 27: | Line 32: | ||
bool=0 | bool=0 | ||
for word in $file; do | for word in $file; do | ||
− | if [[ (-r $word) && (-s $word) && (! $word = *~ ) ]]; then | + | if [[ (-r $word) && (-s $word) && ( -f $word) && (! $word = *~ ) ]]; then |
x=`awk 'NR==c' c=$count $word | wc -m` #considero solo la riga contata da count | x=`awk 'NR==c' c=$count $word | wc -m` #considero solo la riga contata da count | ||
if [[ $x -ne 0 ]]; then #se la riga non è vuota | if [[ $x -ne 0 ]]; then #se la riga non è vuota | ||
Line 39: | Line 44: | ||
fi | fi | ||
count=`expr $count + 1` | count=`expr $count + 1` | ||
+ | done | ||
+ | </source> | ||
+ | |||
+ | ===Soluzione di Davide Quadrelli=== | ||
+ | <source lang="bash"> | ||
+ | #!/bin/bash | ||
+ | if [[ -n $1 ]]; then | ||
+ | cd $1 | ||
+ | files=`ls -p | grep -v /` #elenco file | ||
+ | else | ||
+ | echo"Inserire cartella come parametro" | ||
+ | exit | ||
+ | fi | ||
+ | array=() | ||
+ | #per ogni file nella cartella | ||
+ | for file in $files; do | ||
+ | i=0 | ||
+ | while read line; do | ||
+ | #conto la lunghezza di ogni riga e la aggiungo nella corrispondente cella dell'array | ||
+ | len=`expr length "${line}"` | ||
+ | array[$i]=`expr ${array[$i]} + $len` | ||
+ | ((i++)) | ||
+ | done < $file | ||
+ | done | ||
+ | #a questo punto l'i-esima cella contiene la somma delle lunghezze della i-esima riga di ogni file | ||
+ | i=1 | ||
+ | for n in ${array[@]}; do | ||
+ | echo "$i $n" | ||
+ | ((i++)) | ||
done | done | ||
</source> | </source> |
Latest revision as of 15:07, 5 April 2015
Consegna([1]):
Sia data una directory che contiene file di testo.
Scopo dell'esercizio e' di contare i caratteri delle corrispondenti righe di testo di tutti i file della directory, si vuole cioe' sapere
il numero totale di caratteri presenti nelle prime righe di tutti i file, nelle seconde linee, ecc.
$ ccpl mydir
1 234
2 21
3 333
.....
l'ouput significa che se contiamo tutti i caratteri contenuti nella prima riga di tutti i file in mydir otteniamo 234 (mydir/file1
puo' avere 40 caratteri nella prima riga, mydir/file2 ne puo' avere 20, ecc... procedendo per tutti i file di mydir la somma fa
234).
Soluzione di Maldus
#! /bin/bash
count=1 #conta il numero di riga che sto considerando
bool=1 #resta 1 finchè ci sono righe da contare in qualche file
if [[ -n $1 ]]; then
cd $1
else
exit 1
fi
file=`ls`
while [[ $bool -eq 1 ]]; do
tot=0
bool=0
for word in $file; do
if [[ (-r $word) && (-s $word) && ( -f $word) && (! $word = *~ ) ]]; then
x=`awk 'NR==c' c=$count $word | wc -m` #considero solo la riga contata da count
if [[ $x -ne 0 ]]; then #se la riga non è vuota
tot=`expr $tot + $x - 1` #con -1 tolgo il carattere \n che era stato contato da awk
bool=1 #bool=1 finchè c'è qualche riga da contare
fi
fi
done
if [[ $bool -eq 1 ]]; then
echo "$count: $tot"
fi
count=`expr $count + 1`
done
Soluzione di Davide Quadrelli
#!/bin/bash
if [[ -n $1 ]]; then
cd $1
files=`ls -p | grep -v /` #elenco file
else
echo"Inserire cartella come parametro"
exit
fi
array=()
#per ogni file nella cartella
for file in $files; do
i=0
while read line; do
#conto la lunghezza di ogni riga e la aggiungo nella corrispondente cella dell'array
len=`expr length "${line}"`
array[$i]=`expr ${array[$i]} + $len`
((i++))
done < $file
done
#a questo punto l'i-esima cella contiene la somma delle lunghezze della i-esima riga di ogni file
i=1
for n in ${array[@]}; do
echo "$i $n"
((i++))
done