Вот что я пытаюсь сделать: я хочу измерить расстояние Левенштейна между двумя строками, используя bash. Я нашел реализацию LD здесь .
Теперь предположим, что у меня есть данные игрушек, например:
1 The brown fox jumped The green fox jumped
0 The red fox jumped The green fox jumped
1 The gray fox jumped The green fox jumped
и скажем, что это хранится в data.test
.
Затем я ввел это с помощью простой команды awk
, которая отфильтровывает строки, начинающиеся с 1
, примерно так:
awk -F '\t' '{if ($1>0) print $2,t,$3}' data.test
Первый вывод этой простой команды будет:
The brown fox jumped The green fox jumped
Теперь я хочу измерить расстояние Левенштейна между этими двумя предложениями, передавая этот вывод непосредственно в эту функцию (снято с ссылки выше):
function levenshtein {
if (( $# != 2 )); then
echo "Usage: $0 word1 word2" >&2
elif (( ${#1} < ${#2} )); then
levenshtein "$2" "$1"
else
local str1len=${#1}
local str2len=${#2}
local d
for i in $( seq 0 $(( (str1len+1)*(str2len+1) )) ); do
d[i]=0
done
for i in $( seq 0 $str1len ); do
d[i+0*str1len]=$i
done
for j in $( seq 0 $str2len ); do
d[0+j*(str1len+1)]=$j
done
for j in $( seq 1 $str2len ); do
for i in $( seq 1 $str1len ); do
[ "${1:i-1:1}" = "${2:j-1:1}" ] && local cost=0 || local cost=1
del=$(( d[(i-1)+str1len*j]+1 ))
ins=$(( d[i+str1len*(j-1)]+1 ))
alt=$(( d[(i-1)+str1len*(j-1)]+cost ))
d[i+str1len*j]=$( echo -e "$del\n$ins\n$alt" | sort -n | head -1 )
done
done
echo ${d[str1len+str1len*(str2len)]}
fi
}
Я знаю, что вы можете сделать это, но я застреваю, потому что есть два аргумента, которые нужно передать, и тот факт, что я передаю последовательности.
Я пытался использовать различные версии этого предложения, которое поощряет захват ввода как таковой:
function levenshtein {
# Grab input.
declare input1=${1:-$(</dev/stdin)};
declare input2=${2:-$(</dev/stdin)};
.
.
.
}
Это та часть, которую я не могу заставить работать.