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
-c
opción es un recuento de bytes, no un recuento de caracteresRespuestas:
Echa un vistazo al mensaje de ayuda para
wc
. La-c
opción imprime el número de caracteres. Elecho
comando incluye un carácter de nueva línea por defecto. Cuandowc
ve 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;-w
cuenta el número de palabras y-l
cuenta el número de líneas.Puede canalizar la salida de
wc
aawk
para obtener el número de caracteres, excluyendo los caracteres de nueva línea:La salida predeterminada de
wc
sin 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.fuente
echo -n "k" | wc -c
. Eso tiene sentidoprintf
menudo se prefiere antesecho
cuando la consistencia es importante. No imprime una nueva línea a menos que se le solicite específicamente, por lo queprintf "k" | wc -m
proporciona1
, 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 doawk 'NR==1{print length}' file
.cuando usted
echo "k"
, elecho
comando agrega un carácter de nueva línea a lo que le pidió que imprimiera ("k"). Puede usar la-n
opción para deshabilitar esto:Para ver ese personaje invisible , puede volcar la transmisión con
od
ohd
:fuente
Es porque está utilizando echo (que tiene un retorno de carro), en su lugar use printf:
fuente