Delete count_words.sh.save
This commit is contained in:
@ -1,182 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -uo pipefail
|
|
||||||
# count_words.sh — Räknar underscore-separerade ord i filnamn
|
|
||||||
# Version: 1.3.0
|
|
||||||
|
|
||||||
VERSION="1.3.1"
|
|
||||||
|
|
||||||
# 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]{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
|
|
||||||
Reference in New Issue
Block a user