[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