Esercizio 3, prova pratica 13/09/2013

From Sistemi Operativi
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