这是我想做的事情:我想使用bash测量两个字符串之间的Levensthein距离。我找到了一个LD here的实现。
现在,假设我有一些玩具数据,如下所示:
这个简单命令的第一个输出将会是:
我现在想要测量这两个句子之间的Levensthein距离,通过将此输出直接传输到该函数(从上面的链接中提取):
我知道你可以做到这一点,但是我遇到了两个需要传递的参数和传递序列的问题,所以卡住了。
我尝试使用this的建议的各种版本,该建议主张抓取输入如下:
现在,假设我有一些玩具数据,如下所示:
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
我现在想要测量这两个句子之间的Levensthein距离,通过将此输出直接传输到该函数(从上面的链接中提取):
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
}
我知道你可以做到这一点,但是我遇到了两个需要传递的参数和传递序列的问题,所以卡住了。
我尝试使用this的建议的各种版本,该建议主张抓取输入如下:
function levenshtein {
# Grab input.
declare input1=${1:-$(</dev/stdin)};
declare input2=${2:-$(</dev/stdin)};
.
.
.
}
这是我无法完全让其正常工作的部分。