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.
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
-c
opção é uma contagem de bytes, não uma contagem de caracteresRespostas:
Dê uma olhada na mensagem de ajuda para
wc
. A-c
opção imprime o número de caracteres. Oecho
comando inclui um caractere de nova linha por padrão. Quandowc
vê 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;-w
conta o número de palavras e-l
o número de linhas.Você pode canalizar a saída de
wc
paraawk
obter o número de caracteres excluindo os caracteres de nova linha:A saída padrão
wc
sem 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.fonte
echo -n "k" | wc -c
. Isso faz sentidoprintf
geralmente é preferido antesecho
quando a consistência é importante. Ele não imprime uma nova linha, a menos que seja solicitado especificamente, o queprintf "k" | wc -m
indica1
, 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çaawk 'NR==1{print length}' file
.quando você
echo "k"
, oecho
comando acrescenta um caractere de nova linha ao que você pediu para imprimir ("k"). Você pode usar a-n
opção para desativar isso:Para visualizar esse caractere invisível , você pode despejar o fluxo com
od
ouhd
:fonte
É porque você está usando echo (que tem um retorno de carro), em vez disso, use printf:
fonte