shell linux wc -c count caracteres +1

17

Eu usei o comando wc -c para contar o número de caracteres, mas ele me fornece um número errado, número de caracteres mais um como exemplo:

echo "k" | wc -c 

me dá 2 caracteres

então porque não 1?

Mohammad Karmi
fonte
3
a -copção é uma contagem de bytes, não uma contagem de caracteres
mcalex
1
-m, --chars imprime a contagem de caracteres Eu também usei o mesmo problema #
Mohammad Karmi
Você está certo, pensei que o unicode tivesse dois bytes por caractere, mas parece que as letras ascii no uni ainda são de 1 byte. Curioso. Estou pensando em EOL
mcalex 30/12/12
1
sim, eu digitei "k" em um arquivo e ele mostra 2 caracteres que eu removi, então mostra 0 curioso
Mohammad Karmi

Respostas:

19

Dê uma olhada na mensagem de ajuda para wc. A -copção imprime o número de caracteres. O echocomando inclui um caractere de nova linha por padrão. Quando wcvê a nova linha, ela conta como outro caractere e, portanto, a contagem adicional em seu resultado. Você pode contornar isso usando uma das alternativas mostradas abaixo; -wconta o número de palavras e -lo número de linhas.

echo "k" | wc -w 
echo "k" | wc -l

Você pode canalizar a saída de wcpara awkobter o número de caracteres excluindo os caracteres de nova linha:

wc <filename> | awk '{print $3-$1}'

A saída padrão wcsem opções imprime o número de caracteres de nova linha (US $ 1 para awk), número de palavras e número de caracteres (US $ 3 para awk) nessa ordem.

dinesh
fonte
ok, então não há uma palavra e uma linha, mas OP quer saber por que existem dois caracteres / bytes
mcalex
Eu quero contar o número de caracteres, não as palavras nem as linhas
Mohammad Karmi
5
ahhh, então você quer dizer echo -n "k" | wc -c. Isso faz sentido
mcalex 30/12/12
Coloquei o char no arquivo e dá para que o EOF contei? ou nova linha ou o quê ?, Como eu quero contar mais de um caractere
Mohammad Karmi
1
@ user1865719: printfgeralmente é preferido antes echoquando a consistência é importante. Ele não imprime uma nova linha, a menos que seja solicitado especificamente, o que printf "k" | wc -mindica 1, ou seja, o número de caracteres impressos. Para contar caracteres na primeira linha de um arquivo, pode-se fazer, por exemplo $(($(head -1 file | wc -m)-1))(envolvê-lo $(())para fazer aritmética de shell para remover a contagem de nova linha) ou ainda melhor: use awk e faça awk 'NR==1{print length}' file.
Daniel Andersson
12

quando você echo "k", o echocomando acrescenta um caractere de nova linha ao que você pediu para imprimir ("k"). Você pode usar a -nopção para desativar isso:

echo -n k | wc -c
1

Para visualizar esse caractere invisível , você pode despejar o fluxo com odou hd:

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl
F. Hauri
fonte
6

É porque você está usando echo (que tem um retorno de carro), em vez disso, use printf:

$ echo k | wc -c 2

$ printf k | wc -c 1
usuario
fonte