#!/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 <&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