contar palabras en LISTA sin separadores

contar palabras en LISTA sin separadores

Tengo el siguiente código ksh simple:

 MY_LIST=first,second,third
 NUM_IN_LIST=` echo $MY_LIST | sed s"/,/ /g" | wc -w `
 print $NUM_IN_LIST
 3
 [[ $NUM_IN_LIST = 3 ]] && print match

 but I dont get the match print -:(

tal vez porque algunos espacios?

¿Puedo recibir alguna otra sugerencia para contar e imprimir las palabras en $MY_LIST? (después de quitar el separador ",")

Respuesta1

Tu ejemplo funciona para mí.

Aquí tienes una alternativa:

MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match

Respuesta2

Su código debería funcionar, pero sólo si $MY_LISTno contiene ninguno de los diversos caracteres especiales:

  • echo $MY_LISTdebería ser printf %s "$MY_LIST"o print -r -- "$MY_LIST". La falta de comillas le indica al shell que expanda los caracteres globales \\*?[. También le dice al shell que divida palabras en espacios, aunque eso no importaría aquí excepto por el siguiente problema.
  • El uso echotambién provoca la interpretación de barras invertidas y un interlineado -en algunas circunstancias.
  • `sed s"/,/ /g" crea comas y espacios como separadores de palabras.

Un problema adicional que explica por qué la prueba final no funciona es que wc -wproduce resultados con espacios iniciales, que se capturan en archivos $NUM_IN_LIST. print $NUM_IN_LISTrealiza división de palabras $NUM_IN_LIST, por lo que termina simplemente imprimiendo los dígitos; hacer print "$NUM_IN_LIST"para ver la diferencia. La [[ … ]]construcción inhibe la división de palabras y =es un operador de comparación de cadenas, por lo que se le ha dicho correctamente que ' 3'no es lo mismo que '3'. [[ $NUM_IN_LIST -eq 3 ]]o [ $NUM_IN_LIST = 3 ]hubiera sido cierto (pero ninguna de las dos es una solución real, son solo soluciones limitadas).


Una forma puramente ksh de mostrar el número de campos separados por comas es

commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}

Si alguien necesita una solución POSIX sh, reemplace la primera línea por commas=$(printf %s "$MY_LIST" | tr -dc ,).

información relacionada