[Solar-general] bash: como encontrar los strings que mejor coinciden?
Pablo Manuel Rizzo
info en pablorizzo.com
Dom Ago 29 20:51:41 CEST 2010
2010/8/29 Pablo Manuel Rizzo <info en pablorizzo.com>:
> Necesito resolver esto en bash:
>
> Tengo un primer string y un conjunto de strings. Necesito saber cual
> es el string del conjunto que mejor coincide con el primer string. Dos
> strings coinciden cuando comienzan con los mismos caracteres, y
> coinciden mejor cuando tienen el máximo de caracteres en común al
> inicio.
> Por ejemplo
>
>
> Primer string: 12345abcde
>
> Conjunto de strings:
>
> 12345abzzz
> 12345abczz
> 12345abcdz
> 12345abxde
> 12346abdce
>
> En el ejemplo, el string del conjunto que mejor coincide es el tercero
> (12345abcdz), porque tiene 9 caracteres iniciales en común con el
> primer string.
>
> Alguna idea de cómo evaluar eso en bash?
Por ahora no encontré nada más directo que haga eso.
Esta función parece que funciona, al menos para conjuntos chicos,
quizá para volúmenes grandes sea mejor armar un diccionario y usar
look o algo así.
Si hay más de una mejor coincidencia, devuelve todas, luego cada uno
elegirá de acuerdo a algún otro criterio.
_________________
#!/bin/bash
mejorCoincidenteCadena() {
if [[ $# -lt 2 ]]; then
eError "mejorCoincidenteCadena <modelo> <cadena-de-cadenas"
exit 1
fi
local primera="$1"
shift
local conjunto="$@"
local coincidencias
for ((i=0;i<${#primera};i++))
do
coincidencias=$(echo "$conjunto" |grep "^${primera:0:$i}")
if [[ "$coincidencias" = "" ]];then
break
else
conjunto="$coincidencias"
fi
done
echo "$conjunto"
}
cadenas="12345abzzz
12345abczz
12345abcdz
12345abxde
12346abdce"
modelo="12345abcde"
mejorCoincidenteCadena $modelo "$cadenas"
_________________
--
Pablo Manuel Rizzo
-------------------------------
http://pablorizzo.com
-------------------------------
Más información sobre la lista de distribución Solar-general