ПОС/Лаб 3 2021
Лаб 3 је у школској години 2020/21 рађен у трећем термину вежби, што је одсуство од досадашњег шаблона услед пандемије.
Група 3
Задатак 1
Поставка
Написати bash скрипту која треба дапомогне[sic] наставницима Електротегничког[sic] факултета да открију студенте који недозвољено сарађују приликом израде домаћих задатака. Скрипта треба да пореди радове студената и да на крају испише парове студената са одређеном сличношћу њихових радова. Приликом поређења празне линије се не тумаче као идентичне. Скрипта прима следеће аругменте:
- Опциони параметар са аргументом -f. Путања до директоријума у коме се налазе студентски радови. Студентски рад је текстуална датотека која се зове ccggggbbbb, где су cc иницијали студента, gggg година уписа, а bbbb број индекса.
- Опциони параметар са аргументом -s. Број индекса студента чији ће се рад упоређивати са осталима. Број индекса се задаје у формату ggggbbbb, где је gggg година уписа, а bbbb број индекса.
- Опциони параметар са аргументом -n. Минималан број идентичних линија које треба пронаћи у два рада[sic] да би се сматрало да је тај пар студената недозвољено[sic] сарађивао. Ако није наведена овај опција, сматрати да је минимум једна идентична линија.
- Опциони параметар -l, исписује парове студената који су недозвољено сарађивали у формату ggggbbbb1 ggggbbbb2 broj_identičnih_linija, где је ggggbbbb1 број индекса студента за кога су се тражили слични радови, а ggggbbbb2 број индекса студента са чијим радом је пронађена сличност.
Опциони параметри -f и -s су обавезни, ако се не наведу пријавити грешку. Пријавити грешку иако се унесе индекс лошег формата. Ако опциони параметар -l није наведен исписати само пар са највише идентичних линија кода. Дозвољено је коришћење додатних фајлова, који морају бити избрисани након завршетка скрипте.
Решење
Једно од решења које има максимални број бодова:
#!/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