Esercizio 3, prova pratica 13/09/2013
Jump to navigation
Jump to search
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