ПОС/Лаб 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