linux shell wc -c cuenta caracteres +1


17

Usé el comando wc -c para contar el número de caracteres, pero me da un número incorrecto, número de caracteres más uno como ejemplo:

echo "k" | wc -c 

me da 2 personajes

Entonces, ¿por qué no 1?


3
la -copción es un recuento de bytes, no un recuento de caracteres
— mcalex

1
-m, - los caracteres imprimen los recuentos de caracteres También utilicé este mismo problema
— Mohammad Karmi

Tienes razón, pensé que unicode era de dos bytes por char, pero parece que las letras ascii en uni todavía son de 1 byte. Curioso. Estoy pensando en EOL
— mcalex

1
Sí, escribí "k" en un archivo y muestra 2 caracteres que lo eliminé, por lo que muestra 0 curioso
— Mohammad Karmi

Respuestas:


19

Echa un vistazo al mensaje de ayuda para wc. La -copción imprime el número de caracteres. El echocomando incluye un carácter de nueva línea por defecto. Cuando wcve la nueva línea, la cuenta como otro personaje y, por lo tanto, la cuenta adicional en su resultado. Puede solucionar esto utilizando una de las alternativas que se muestran a continuación; -wcuenta el número de palabras y -lcuenta el número de líneas.

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

Puede canalizar la salida de wca awkpara obtener el número de caracteres, excluyendo los caracteres de nueva línea:

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

La salida predeterminada de wcsin opciones imprime la cantidad de caracteres de nueva línea ($ 1 a awk), la cantidad de palabras y la cantidad de caracteres ($ 3 a awk) en este orden.


ok, entonces hay una palabra y una línea, pero OP quiere saber por qué hay dos caracteres / bytes
— mcalex

Quiero contar el número de caracteres, no palabras ni líneas
— Mohammad Karmi

55
ahhh, entonces quieres decir echo -n "k" | wc -c. Eso tiene sentido
— mcalex

Puse el char en el archivo y da para que el EOF cuente? ¿o nueva línea o qué ?, como quiero contar más de un personaje
— Mohammad Karmi

1
@ user1865719: a printfmenudo se prefiere antes echocuando la consistencia es importante. No imprime una nueva línea a menos que se le solicite específicamente, por lo que printf "k" | wc -mproporciona 1, es decir, la cantidad de caracteres impresos. Para contar caracteres en la primera línea de un archivo, se puede hacer, por ejemplo $(($(head -1 file | wc -m)-1))(envolverlo $(())para hacer aritmética de shell para eliminar el recuento de nueva línea) o incluso mejor: usar awk y do awk 'NR==1{print length}' file.
— Daniel Andersson

12

cuando usted echo "k", el echocomando agrega un carácter de nueva línea a lo que le pidió que imprimiera ("k"). Puede usar la -nopción para deshabilitar esto:

echo -n k | wc -c
1

Para ver ese personaje invisible , puede volcar la transmisión con odo 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

6

Es porque está utilizando echo (que tiene un retorno de carro), en su lugar use printf:

$ echo k | wc -c 2

$ printf k | wc -c 1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.