Sunteți pe pagina 1din 6

Proiect sisteme de operare

Tema proiectului:
Aplicatie pentru prelucrarea continutului fisierelor

Aplicatia dezvoltata este destinata prelucratii continutului fisierelor, si ofera utilizatorilor


posibilitatea efectuarii urmatoarelor operatii:
1. Calcularea numarului de elemente, precum linii, cuvinte si caractere, dintr-un fisier dat ca
parametru in linia de comanda.
2. Inversarea liniilor unui fisier primit ca parametru.
3. Cautarea unui cuvant intr-un fisier - se afiseaza numarul si continutul randului corespunzator
fiecarei aparitii a cuvantului respectiv.
4. Identificarea primelor n cuvinte cel mai des folosite dintr-un fisier dat ca parametru, folosind ca si
delimitatori caracterele spatiu si new line.
5. Calcularea minimului si maximului dintr-un fisier dat ca parametru. Cuvintele/numerele din fisier
pot fi introduse pe mai multe linii, si sunt separate prin spatiu sau tab.

Modul de utilizare al scriptului este urmatorul: (dupa adaugarea dreptului de executie in


prealabil), se executa scriptul cu parametrul help sau fara nici un parametru, caz in care se
afiseaza modul de utilizare al scriptului, si anume operatiile disponibile a fi executate si
parametrii de intrare pentru fiecare caz in parte. Exemplu:

In imaginile de mai jos, sunt prezentate executiile scriptului, putandu-se observa atat valorile
parametrilor de intrare, cat si rezultatele. Fisierul folosit ca si parametru de intrare, se numeste
test.txt si are urmatorul continut:

1. Calcularea numarului de elemente, precum linii, cuvinte si caractere, dintr-un fisier dat ca
parametru in linia de comanda.
- Calcularea numarului de linii din fisierul dat ca parametru de intrare

Calcularea numarului de cuvinte din fisierul dat ca parametru de intrare

2. Inversarea liniilor unui fisier primit ca parametru.


3. Cautarea unui cuvant intr-un fisier - se afiseaza numarul si continutul randului corespunzator
fiecarei aparitii a cuvantului respective.

4. Identificarea primelor n cuvinte cel mai des folosite dintr-un fisier dat ca parametru, folosind ca si
delimitatori caracterele spatiu si new line.

Codul sursa al scriptului shell este urmatorul:


#!/bin/sh
# Functie care afiseaza modul de utilizare al script-ului, specificand parametri necesari pentru
fiecare operatie in parte.
usage() {
echo "Utilizare comanda:" $0 "-OPTION"
echo "unde -OPTION este obligatoriu, si poate avea una din valorile:"
echo "
-help
-> afiseaza modul de utilizare al programului"
echo "
-count TYPE filename
-> calculeaza numarul de elemente de tipul TYPE din fisierul
dat ca parametru, "
echo "
unde TYPE poate avea una din valorile:"
echo "
lines
-> pentru numarul de linii"
echo "
words
-> pentru numarul de cuvinte"
echo "
characters -> pentru numarul de caractere"
echo "
-reverse filename
-> inverseaza liniile din fisierul dat ca parametru (ultima
linie va fi prima s.a.m.d.)"
echo "
-find word filename
-> gaseste aparitiile cuvantului <word> in fisierul dat ca
parametru"
echo "
-statistics <n> filename -> calculeaza o statistica a celor mai dese <n> cuvinte
gasite in fisierul dat ca parametru"
echo "
separatorul cuvintelor este spatiul sau linie noua"

echo "
-minimax filename
in fisierul dat ca parametu"
}

-> calculeaza minimul, maximul si cate numere au fost gasite

# Functie care afiseaza un mesaj de eroare si modul de utilizare al acestui script.


# Este apelata in cazul in care utilizatorul nu apeleaza scriptul cu un set valid de parametri.
error() {
echo "EROARE: Comanda a fost chemata incorect."
echo
usage
}

# 01. Calcularea numarului de linii/cuvinte/caractere din fisierul dat ca parametru.


count_lines() {
# comanda "wc -l" numara numaul de caractere new line (LF), iar din output-ul ei se extrage
# doar acest numar, folosing comanda "cut" (-d specifica setul de delimitatori,
# iar -f numarul coloanei care se extrage)
case $1 in
lines)
count=`wc -l $2 | cut -d ' ' -f 1`
# numarul total de linii contine si ultima linie din fisier (case nu are caracterul LF la
final)
# din acest motiv se incrementeaza numarul total de linii
let "count=$count+1"
echo "Numarul de linii din fisier este:" $count
;;
words)
count=`wc -w $2 | cut -d ' ' -f 1`
echo "Numarul de cuvinte din fisier este:" $count
;;
characters)
count=`wc -m $2 | cut -d ' ' -f 1`
echo "Numarul de caractere din fisier este:" $count
;;
*)
error
;;
esac
}

# 02. Inversarea liniilor unui fisier primit ca parametru.


reverse_lines() {
tac $1
}

# 03. Cautarea unui cuvant intr-un fisier - se afiseaza numarul si continutul randului
corespunzator fiecarei aparitii
# Cautarea cuvantului dat ca parametru se face cu ajutorul comenzii grep.
# Insa inainte de cautarea propriu-zisa, se prefixeaza fiecare linie cu munarul ei in cadrul
fisierului.
# Acest lucru este realizat cu ajutorul comenzii sed.
find_word() {
sed '/./=' $2 | sed '/./N; s/\n/ /' | grep $1
}

# 04. Identificarea primelor n cuvinte cel mai des folosite dintr-un fisier dat ca parametru,
utilizand un spatiu si
# linia noua ca delimitatori.
compute_word_statistics() {
tr -s ' ' '\n' < $2 | uniq -c | sort -r | head -n $1
}

# 05. Calcularea minimului si maximului dintr-un fisier dat ca parametru. Cuvintele/numerele din
fisier
# pot fi introduse pe mai multe linii, si sunt separate prin spatiu sau tab.
# Calculul acestor valori se face cu ajutorul comenzii awk. Aceasta parseaza linie cu linie
# fisierul de intrare, iterand pe fiecare camp din linie (campurile sunt considerate a fi
separate
# prin spatiu sau tab orizontal), si identificand numerele.
# Astfel, la parcurgerea intregului fisier, s-au calculat minimul, maximul, precum si
# numarul total de numere ce apar in fisier.
minimax() {
awk '
BEGIN {
max = -1000000;
min = 1000000;
count = 0;
}
function isnum(n) {return (n ~ /^[+-]?[0-9]+[.]?[0-9]*$/)}
{
for (i=1; i<= NF; i+=1) {
if ( isnum($i) ) {
if (max < $i) { max = $i; }
if (min > $i) { min = $i; }
count+=1;
}
}
}
END {
print "Numarul maxim este: " max;
print "Numarul minim este: " min;
print "In total au fost gasite " count " numere.";
}
' $1
}
# Executia scriptului incepe cu verificarea parametrilor de intrare.
# In functie de numarul lor, se face o validare a valorilor introduse pentru
# diversele operatii. In functie de identificarea valorilor parametrilor de
# intrare, se apeleaza una din functiile definite pentru fiecare din operatiile
# suportate de acest script. Apelurile de functii se fac prin retransmiterea
# parametrilor de intrare ai scriptului parinte.
# In cazul in care exista vreo greseala in ceea ce priveste numarul de parametri
# sau valorile acestora, se va afisa un mesaj de eroare precum si un mesaj de
# ajutor pentru explicarea folosirii corecte a scriptului.
case $# in
1)
if test "$1" = "-help"; then
usage
else
error
fi

;;
2)
if test "$1" = "-reverse"; then
reverse_lines $2
elif test "$1" = "-minimax"; then
minimax $2
else
error
fi
;;
3)
if test "$1" = "-find"; then
find_word $2 $3
elif test "$1" = "-count"; then
case $2 in
lines|words|characters)
count_lines $2 $3
;;
*)
error
;;
esac
elif test "$1" = "-statistics"; then
compute_word_statistics $2 $3
else
error
fi
;;
*)
error
;;
esac