184 lines
4.5 KiB
Bash
Executable File
184 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -uo pipefail
|
|
# count_words.sh — Räknar underscore-separerade ord i filnamn
|
|
# Version: 1.3.0
|
|
|
|
VERSION="1.3.0"
|
|
|
|
# Usage:
|
|
# ./count_words.sh [katalog] [--to-file] [--ext "mp4,avi,mkv"] [--version]
|
|
#
|
|
# Exempel:
|
|
# ./count_words.sh .
|
|
# ./count_words.sh /path --to-file
|
|
# ./count_words.sh /path --ext "mp4,avi" --to-file
|
|
# ./count_words.sh --version
|
|
|
|
DIR="."
|
|
TO_FILE=false
|
|
OUTFILE="reserved__words.txt"
|
|
EXTS=("mp4") # default
|
|
|
|
print_help() {
|
|
cat <<EOF
|
|
count_words.sh v$VERSION
|
|
Räknar ord (underscore-separerade) i filnamn, case-insensitive.
|
|
Ignorerar filändelser; filtrerar på angivna ändelser (default: mp4).
|
|
Ignorerar prefix som [WUNF] eller [WUNF_001] i filnamn.
|
|
|
|
Usage:
|
|
$0 [dir] [--to-file] [--ext "mp4,avi,mkv"] [--version]
|
|
|
|
Flaggor:
|
|
--to-file Skriv endast orden (kommaseparerat) till $OUTFILE (append utan dubbletter)
|
|
--ext "a,b,c" Tillåtna filändelser (kommaseparerad lista), t.ex. "mp4,avi"
|
|
--version Skriv ut version och avsluta
|
|
-h, --help Visa denna hjälp
|
|
EOF
|
|
}
|
|
|
|
# Om första argumentet är en katalog, använd den
|
|
if [[ $# -gt 0 && -d "${1:-}" ]]; then
|
|
DIR="$1"
|
|
shift
|
|
fi
|
|
|
|
# Arg-parsning
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--to-file)
|
|
TO_FILE=true; shift ;;
|
|
--ext)
|
|
shift
|
|
IFS=',' read -r -a EXTS <<< "${1:-}"
|
|
shift || true
|
|
;;
|
|
--version)
|
|
echo "$VERSION"
|
|
exit 0
|
|
;;
|
|
-h|--help)
|
|
print_help; exit 0 ;;
|
|
*)
|
|
echo "Okänt argument: $1" >&2
|
|
print_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Bygg lookup för tillåtna ändelser (lowercase)
|
|
declare -A ALLOWED_EXT=()
|
|
for e in "${EXTS[@]}"; do
|
|
[[ -n "$e" ]] || continue
|
|
ALLOWED_EXT["${e,,}"]=1
|
|
done
|
|
|
|
declare -A counts=()
|
|
|
|
shopt -s nullglob
|
|
for f in "$DIR"/*; do
|
|
[[ -f "$f" ]] || continue
|
|
name=$(basename "$f")
|
|
|
|
# Filtrera på tillåtna ändelser
|
|
ext="${name##*.}"
|
|
if [[ "$name" == "$ext" ]]; then
|
|
continue # ingen ändelse
|
|
fi
|
|
ext_lc="${ext,,}"
|
|
[[ ${ALLOWED_EXT[$ext_lc]+_} ]] || continue
|
|
|
|
# Ta bort ändelsen
|
|
base="${name%.*}"
|
|
|
|
# TA BORT WUNF-PREFIX: [WUNF] eller [WUNF_ddd] var som helst i namnet
|
|
# (behåll allt annat)
|
|
base_noprefix=$(sed -E 's/\[WUNF(_[0-9]{1,3})?\]//g' <<< "$base")
|
|
# base_noprefix=$(sed -E 's/\[WUNF(_[0-9]{3})?\]//g' <<< "$base")
|
|
|
|
# Splitta på '_' och räkna (case-insensitive)
|
|
oldIFS=$IFS
|
|
IFS='_'
|
|
read -r -a parts <<< "$base_noprefix"
|
|
IFS=$oldIFS
|
|
|
|
for word in "${parts[@]}"; do
|
|
# Trimma whitespace
|
|
w="$word"
|
|
w="${w#"${w%%[![:space:]]*}"}" # trim left
|
|
w="${w%"${w##*[![:space:]]}"}" # trim right
|
|
[[ -n "$w" ]] || continue
|
|
|
|
# Normalisera till lowercase
|
|
w_lc="${w,,}"
|
|
|
|
# Initiera och öka
|
|
: "${counts[$w_lc]:=0}"
|
|
(( counts[$w_lc]++ ))
|
|
done
|
|
done
|
|
|
|
# Samla ord med förekomst > 2
|
|
results=()
|
|
for w in "${!counts[@]}"; do
|
|
if (( counts[$w] > 2 )); then
|
|
results+=("${counts[$w]} $w")
|
|
fi
|
|
done
|
|
|
|
# Ingen träff?
|
|
if [[ ${#results[@]} -eq 0 ]]; then
|
|
if $TO_FILE; then
|
|
if [[ -f "$OUTFILE" ]]; then
|
|
echo "Inga nya ord (>2) hittades. Filen lämnades oförändrad. (v$VERSION)"
|
|
else
|
|
: > "$OUTFILE"
|
|
echo "Inga ord (>2) hittades. Tom fil skapad: $OUTFILE (v$VERSION)"
|
|
fi
|
|
else
|
|
echo "Inga ord förekom mer än två gånger. (v$VERSION)"
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# Sortera: primärt på antal (fallande), sekundärt på ord (stigande)
|
|
sorted_lines=$(printf "%s\n" "${results[@]}" | sort -nrk1,1 -k2,2)
|
|
|
|
if $TO_FILE; then
|
|
# Nya ord (lowercase redan), en per rad
|
|
new_words=$(printf "%s\n" "$sorted_lines" | awk '{print $2}')
|
|
|
|
# Läs befintliga ord från OUTFILE (om den finns) och bygg union utan dubbletter
|
|
declare -A uniq=()
|
|
if [[ -f "$OUTFILE" ]]; then
|
|
# Tolka både kommatecken och whitespace som separerare
|
|
while IFS= read -r tok; do
|
|
w="$tok"
|
|
# trim
|
|
w="${w#"${w%%[![:space:]]*}"}"
|
|
w="${w%"${w##*[![:space:]]}"}"
|
|
[[ -n "$w" ]] || continue
|
|
uniq["${w,,}"]=1
|
|
done < <(tr -s ',[:space:]' '\n' < "$OUTFILE")
|
|
fi
|
|
|
|
# Lägg till nya ord
|
|
while IFS= read -r nw; do
|
|
[[ -n "$nw" ]] || continue
|
|
uniq["$nw"]=1
|
|
done <<< "$new_words"
|
|
|
|
# Bygg kommaseparerad sträng (alfabetiskt för determinism)
|
|
all_words=$(printf "%s\n" "${!uniq[@]}" | sort -u | paste -sd, -)
|
|
|
|
# Skriv tillbaka hela unionen (utan dubbletter)
|
|
echo "$all_words" > "$OUTFILE"
|
|
echo "Resultat uppdaterat i $OUTFILE (v$VERSION)"
|
|
else
|
|
echo "Ord som förekommit mer än två gånger (sorterat högst->lägst) — v$VERSION:"
|
|
while read -r count word; do
|
|
echo "$word ($count ggr)"
|
|
done <<< "$sorted_lines"
|
|
fi
|