contar palavras em LIST sem separadores

contar palavras em LIST sem separadores

Eu tenho o seguinte código ksh simples:

 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 -:(

talvez porque alguns espaços?

posso obter alguma outra sugestão para contar e imprimir as palavras $MY_LIST ? (depois de remover o separador ",")

Responder1

Seu exemplo funciona para mim.

Aqui está uma 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

Responder2

Seu código deve funcionar, mas somente se $MY_LISTnão contiver nenhum dos vários caracteres especiais:

  • echo $MY_LISTdeveria ser printf %s "$MY_LIST"ou print -r -- "$MY_LIST". A falta de aspas diz ao shell para expandir caracteres globbing \\*?[. Ele também diz ao shell para dividir as palavras em espaços, embora isso não importe aqui, exceto no próximo problema.
  • O uso echoadicional causa a interpretação de barras invertidas e um início -em algumas circunstâncias.
  • `sed s"/,/ /g" cria vírgulas e espaços como separadores de palavras.

Um problema adicional, que explica por que seu teste final não funciona, é que ele wc -wproduz resultados com espaços iniciais, que são capturados em $NUM_IN_LIST. print $NUM_IN_LISTrealiza a divisão de palavras em $NUM_IN_LIST, então acaba imprimindo apenas os dígitos; fazer print "$NUM_IN_LIST"para ver a diferença. A [[ … ]]construção inibe a divisão de palavras e =é um operador de comparação de strings, portanto, você foi informado corretamente de que ' 3'não é a mesma coisa que '3'. [[ $NUM_IN_LIST -eq 3 ]]ou [ $NUM_IN_LIST = 3 ]teria sido verdade (mas nenhuma delas é uma solução real, são apenas soluções alternativas limitadas).


Uma maneira ksh pura de mostrar o número de campos separados por vírgula é

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

Se alguém precisar de uma solução POSIX sh, substitua a primeira linha por commas=$(printf %s "$MY_LIST" | tr -dc ,).

informação relacionada