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?

Mohammad Karmi
fuente
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.

dinesh
fuente
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
F. Hauri
fuente
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
Mella
fuente