You can use sed to remove the duplicates from string:
for f in *; do
r=$(echo $f | sed -r "s/(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)/\1\2\3\5/g");
echo $r;
done
Replace `echo $f` with `mv "$f" "$r"` if you like the output.
The above `sed` line will take the first matching word and remove the second, if you want to always priorize `Sci-Fi` over `Science Fiction`, even when only `Science Fiction` exists, you can do it in two steps:
for f in *; do
r=$(echo $f | sed "s/{Science Fiction}/{Sci-Fi}/");
s=$(echo $r | sed -r "s/(.*)(\{Sci-Fi\})(.*)(\{Sci-Fi\})(.*)/\1\2\3\5/g");
if [ "$f" != "$s" ]; then
echo "moving " $f " to " $s
fi
done