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 da pomogne[sic] nastavnicima Elektrotehnič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
Jedno od rešenja koje ima maksimalni broj bodova:
#!/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