POS/Lab 3 2021
Lab 3 je u školskoj godini 2020/21 rađen u trećem terminu vežbi, što je odsustvo od dosadašnjeg šablona usled pandemije.
Grupa 3
Zadatak 1
Postavka
Napisati bash skriptu koja treba dapomogne[sic] nastavnicima Elektrotegničkog[sic] fakulteta da otkriju studente koji nedozvoljeno sarađuju prilikom izrade domaćih zadataka. Skripta treba da poredi radove studenata i da na kraju ispiše parove studenata sa određenom sličnošću njihovih radova. Prilikom poređenja prazne linije se ne tumače kao identične. Skripta prima sledeće arugmente:
- Opcioni parametar sa argumentom -f. Putanja do direktorijuma u kome se nalaze studentski radovi. Studentski rad je tekstualna datoteka koja se zove ccggggbbbb, gde su cc inicijali studenta, gggg godina upisa, a bbbb broj indeksa.
- Opcioni parametar sa argumentom -s. Broj indeksa studenta čiji će se rad upoređivati sa ostalima. Broj indeksa se zadaje u formatu ggggbbbb, gde je gggg godina upisa, a bbbb broj indeksa.
- Opcioni parametar sa argumentom -n. Minimalan broj identičnih linija koje treba pronaći u dvarada[sic] da bi se smatralo da je taj par studenatanedozvoljeno[sic] sarađivao. Ako nije navedena ovaj opcija, smatrati da je minimum jedna identična linija.
- Opcioni parametar -l, ispisuje parove studenata koji su nedozvoljeno sarađivali u formatu ggggbbbb1 ggggbbbb2 broj_identičnih_linija, gde je ggggbbbb1 broj indeksa studenta za koga su se tražili slični radovi, a ggggbbbb2 broj indeksa studenta sa čijim radom je pronađena sličnost.
Opcioni parametri -f i -s su obavezni, ako se ne navedu prijaviti grešku. Prijaviti grešku iako se unese indeks lošeg formata. Ako opcioni parametar -l nije naveden ispisati samo par sa najviše identičnih linija koda. Dozvoljeno je korišćenje dodatnih fajlova, koji moraju biti izbrisani nakon završetka skripte.
Rešenje
#!/bin/bash
uneti_obavezni=0
broj_identicnih=1
ispisi_parove=0
while getopts f:s:n:l opt
do
case $opt in
f) let uneti_obavezni++
read -p "Putanja do direktorijuma: " direktorijum
;;
s) let uneti_obavezni++
read -p "Indeks studenta: " indeks_studenta
;;
n) read -p "Minimalan broj identicnih linija: " broj_identicnih
;;
l) ispisi_parove=1
;;
*) echo "Koriscenje programa: -fsnl"
exit
;;
esac
done
if [ "$uneti_obavezni" -eq "2" ]; then
echo "Nisu uneti obavezni parametri -f i -s!"
exit
fi
shift "$(( OPTIND - 1 ))"
brojac=0
max_brojac=-1
# Za svaki fajl u direktorijumu gledam na osnovu ovog -s
pushd $direktorijum
for i in $(ls)
do
echo "Gledam fajl $i"
# Uzimam originalnog
for linija in $(cat $(find . -maxdepth 1 -name "*" | grep -E "..$indeks_studenta"))
do
moj=$(find . -maxdepth 1 -name "*" | grep -E "..$indeks_studenta")
if ! [ "./$i" = "$moj" ]; then
# Za svaki njegov gledam sta ima isto sa $i
for novi_linija in $(cat $(find . -maxdepth 1 -name "*" | grep -E "..$i"))
do
if ! [ "$novi_linija" = "\n" ] && [ "$novi_linija" = "$linija" ]; then
let brojac++
fi
done
# Sad gledam treba li da ga ispisujem ili ne kasnije
if ! [ "$brojac" -lt "$broj_identicnih" ]; then
if [ "$ispisi_parove" -eq "1" ]; then
# Ispisujem ovo u fajl
echo "$indeks_studenta i $i imaju $brojac slicnosti" >> temp1
else # Gledam da li je pre bio veci
if [ "$brojac" -gt "$max_brojac" ]; then
max_indeks=$i #$(sed "/$"max_index"/..(.*)/\1")
fi
fi
fi
fi
done
done
if [ "$ispisi_parove" -eq 0 ]; then
echo "Maks indeks je $max_indeks"
else
cat temp1
rm -f temp1
fi