#!/bin/bash
# soundex.sh: Расчет индекса "созвучности"
# =======================================================
# Сценарий Soundex
# Автор
# Mendel Cooper
# thegrendel@theriver.com
# 23 Января 2002 г.
#
# Условия распространения: Public Domain.
#
# Несколько отличающаяся версия этого сценария была опубликована
#+ Эдом Шэфером (Ed Schaefer) в Июле 2002 года в колонке "Shell Corner"
#+ "Unix Review" on-line,
#+ <a href="http://www.unixreview.com/documents/uni1026336632258/
#" title="http://www.unixreview.com/documents/uni1026336632258/
#">http://www.unixreview.com/documents/uni1026336632258/
#</a> =======================================================
ARGCOUNT=1 # Требуется аргумент командной строки.
E_WRONGARGS=70
if [ $# -ne "$ARGCOUNT" ]
then
echo "Порядок использования: `basename $0` имя"
exit $E_WRONGARGS
fi
assign_value () # Присвоить числовые значения
{ #+ символам в имени.
val1=bfpv # 'b,f,p,v' = 1
val2=cgjkqsxz # 'c,g,j,k,q,s,x,z' = 2
val3=dt # и т.п.
val4=l
val5=mn
val6=r
# Попробуйте разобраться в том, что здесь происходит.
value=$( echo "$1" \
| tr -d wh \
| tr $val1 1 | tr $val2 2 | tr $val3 3 \
| tr $val4 4 | tr $val5 5 | tr $val6 6 \
| tr -s 123456 \
| tr -d aeiouy )
# Символам в имени присваиваются числовые значения.
# Удаляются повторяющиеся числа, если они не разделены гласными.
# Гласные игнорируются, если они не являются разделителями, которые удаляются в последнюю очередь.
# Символы 'w' и 'h' удаляются в первую очередь.
}
input_name="$1"
echo
echo "Имя = $input_name"
# Перевести все символы в имени в нижний регистр.
# ------------------------------------------------
name=$( echo $input_name | tr A-Z a-z )
# ------------------------------------------------
# Начальный символ в индекса "созвучия": первая буква в имени.
# --------------------------------------------
char_pos=0 # Начальная позиция в имени.
prefix0=${name:$char_pos:1}
prefix=`echo $prefix0 | tr a-z A-Z`
# Первую букву в имени — в верхний регистр.
let "char_pos += 1" # Передвинуть "указатель" на один символ.
name1=${name:$char_pos}
# ++++++++++++++++++++++++++++ Исключение отдельных ситуаций +++++++++++++++++++++++++++++++
# Теперь мы передвинулись на один символ вправо.
# Если второй символ в имени совпадает с первым
#+ то его нужно отбросить.
# Кроме того, мы должны проверить — не является ли первый символ
#+ гласной, 'w' или 'h'.
char1=`echo $prefix | tr A-Z a-z` # Первый символ — в нижний регистр.
assign_value $name
s1=$value
assign_value $name1
s2=$value
assign_value $char1
s3=$value
s3=9$s3 # Если первый символ в имени — гласная буква
#+ или 'w' или 'h',
#+ то ее "значение" нужно отбросить.
#+ Поэтому ставим 9, или другое
#+ неиспользуемое значение, которое можно будет проверить.
if [[ "$s1" -ne "$s2" || "$s3" -eq 9 ]]
then
suffix=$s2
else
suffix=${s2:$char_pos}
fi
# ++++++++++++++++++++++++ Конец исключения отдельных ситуаций +++++++++++++++++++++++++++++++
padding=000 # Дополнить тремя нулями.
soun=$prefix$suffix$padding # Нули добавить в конец получившегося индекса.
MAXLEN=4 # Ограничить длину индекса 4-мя символами.
soundex=${soun:0:$MAXLEN}
echo "Индекс созвучия = $soundex"
echo
# Индекс "созвучия" - это метод индексации и классификации имен
#+ по подобию звучания.
# Индекс "созвучия" начинается с первого символа в имени,
#+ за которым следуют 3-значный расчетный код.
# Имена, которые произносятся примерно одинаково, имеют близкие индексы "созвучия".
# Например:
# Smith и Smythe — оба имеют индекс "созвучия" "S530".
# Harrison = H625
# Hargison = H622
# Harriman = H655
# Как правило эта методика дает неплохой результат, но имеются и аномалии.
#
#
# Дополнительную информацию вы найдете на
#+ "National Archives and Records Administration home page",
#+ <a href="http://www.nara.gov/genealogy/soundex/soundex.html
#" title="http://www.nara.gov/genealogy/soundex/soundex.html
#">http://www.nara.gov/genealogy/soundex/soundex.html
#</a> Упражнение:
# ----------
# Упростите блок "Исключение отдельных ситуаций" .
exit 0
Последние комментарии