Форум — Development bash: нечёткие совпадения bash 1 3 как найти наиболее подходящее совпадение? например есть список:abcd abcde lolabzd zabdнадо найти наиболее похожее на abd expr? Ссылка
Ответ на: комментарий от Winnerer 12.01.14 12:54:22 MSK Тут скорее расстояние Левенштейна нужно BlackHawk ★ (12.01.14 13:08:38 MSK) Ссылка
$ bash -c "python3 -c \"import difflib;print(difflib.get_close_matches('abd',('abcd','abcde','lolabzd','zabd')))\"" ['zabd', 'abcd', 'abcde'] anonymous (12.01.14 13:46:01 MSK) Показать ответ Ссылка
Ответ на: комментарий от anonymous 12.01.14 13:46:01 MSK годно. megabaks ★★★★ (12.01.14 14:13:47 MSK) автор топика Ссылка
Ответ на: комментарий от aedeph_ 12.01.14 20:36:44 MSK zabdabcdнаиболее близкие megabaks ★★★★ (12.01.14 20:38:49 MSK) автор топика Показать ответ Ссылка
Ответ на: комментарий от megabaks 12.01.14 20:38:49 MSK Какие критерии? Больше символов совпадает? Последовательность учитываем или нет? anonimous ☆ (14.01.14 01:05:39 MSK) Показать ответ Ссылка
Ответ на: комментарий от anonimous 14.01.14 01:05:39 MSK я уже решил задачу.for agrep_opt in 1 2 3 B;do for use_opt in "${use}" "^${use}" "${use}$" "^${use}$";do similar_use="$(agrep -${agrep_opt} "${use_opt}" 2>/dev/null <<< "${ALL_USE}")" [[ -n "${similar_use}" ]] && (( $(wc -l <<< "${similar_use}") '==' 1 )) && break done [[ -n "${similar_use}" ]] && (( $(wc -l <<< "${similar_use}") '==' 1 )) && break [[ -z "${similar_use}" ]] || (( $(wc -l <<< "${similar_use}") '>' 1 )) && similar_use="" done megabaks ★★★★ (14.01.14 01:16:14 MSK) автор топика Последнее исправление: megabaks 14.01.14 01:18:01 MSK (всего исправлений: 2) Показать ответ Ссылка
ну если python, то и zsh сойдёт: zsh# for n in {0..4}; do print -n «$n:»; for i in abcd abcde lolabzd zabd; do [[ abd == (#a$n)$i ]] && print -n " $i"; done; print; done 0: 1: abcd zabd 2: abcd abcde zabd 3: abcd abcde zabd 4: abcd abcde lolabzd zabd zsh# arto ★★ (14.01.14 10:20:20 MSK) Ссылка
см. сюда: http://ru.wikipedia.org/wiki/Расстояние_Левенштейна emulek ★ (14.01.14 10:26:34 MSK) Ссылка
#!/usr/bin/php <?php echo levenshtein($argv[1], $argv[2]); ?> #!/bin/bash declare -a A A[0]="abcd" A[1]="abcde" A[2]="lolabzd" A[3]="zabd" for (( J = 0; J < 4; J++ )); do for (( K = 0; K < 4; K++ )); do if [ $J == $K ]; then continue fi echo -ne "${A[J]}\t${A[$K]}\t" ./lev.php ${A[J]} ${A[K]} echo done done abcd abcde 1 abcd lolabzd 4 abcd zabd 2 abcde abcd 1 abcde lolabzd 5 abcde zabd 3 lolabzd abcd 4 lolabzd abcde 5 lolabzd zabd 4 zabd abcd 2 zabd abcde 3 zabd lolabzd 4 emulek ★ (14.01.14 10:40:25 MSK) Ссылка
Ответ на: комментарий от megabaks 14.01.14 01:16:14 MSK я знал, что ты упорот, но не знал, что настолько... emulek ★ (14.01.14 10:43:42 MSK) Ссылка