10

The following is the content stored in my file

This is my Input

So, using wc -c command we can get the number of characters stored in the file.

My expected output for above file that edited by using Vim in Ubuntu is 16. But, wc -c command returns 17.

Why is the output like this? There isn't even a carriage return at end of line. So, what is the 17th character?

mkrieger1
  • 19,194
  • 5
  • 54
  • 65
mohangraj
  • 9,842
  • 19
  • 59
  • 94

4 Answers4

12

Of course you had enter. Maybe you can't see it. Consider these two examples:

echo -n "This is my Input" | wc -c
16

Because -n is for avoiding enter, but

echo "This is my Input" | wc -c
17

Look at this example too see the new line:

enter image description here

How to see newline?

echo "This is my Input" | od -c

od dumps files in octal and other formats. -c selects ASCII characters or backslash escapes.

And here is an example for file and usage of od:

enter image description here

mkrieger1
  • 19,194
  • 5
  • 54
  • 65
Fattaneh Talebi
  • 727
  • 1
  • 16
  • 42
1

In Linux, when Vim saves buffers, it will terminate every line by appending line terminator of new line.

You can open your file and input :!xxd to view hex-dump or directly use hexdump yourfile command.

0000000: 5468 6973 2069 7320 6d79 2049 6e70 7574  This is my Input
0000010: 0a                                       .
~                                                                                                                                 
~                                                                                                                                 
~    

In there you can see, the file have appended 0a in the end of file.

So when you use wc -c to get the number of this file, it will return 17 that includes the new line symbol.

mkrieger1
  • 19,194
  • 5
  • 54
  • 65
chengpohi
  • 14,064
  • 1
  • 24
  • 42
0

The input string you are giving as input has no enter/new line, but echo is assigning enter/newline to it. And wc -c reads enter or newline from given by the echo command.

For example

echo k | wc -c 

returns 2 because 1 for k and 1 for new line appended by echo.

While

echo -n k | wc -c

returns 1 because -n suppresses the newline.

But wc -c always reads newline.

You can try

printf k | wc -c 

It returns 1.

See what it does in file:

bash-4.1$ echo 1234 > newfile
bash-4.1$ cat newfile
1234
bash-4.1$ cat -e newfile
1234$
bash-4.1$ printf 1234 > newfile
bash-4.1$ cat newfile
1234bash-4.1$ cat -e newfile
1234bash-4.1$
mkrieger1
  • 19,194
  • 5
  • 54
  • 65
Shravan Yadav
  • 1,297
  • 1
  • 14
  • 26
  • But, I pass the input through file only. like "wc -c a.txt" – mohangraj Jul 23 '15 at 10:28
  • 1
    okay try this. echo "This is my Input" > a.txt then run wc -c a.txt and printf "This is my Input" > a.txt and then wc -c a.txt. You know the difference I am talking about. – Shravan Yadav Jul 23 '15 at 10:32
  • Iam using ubuntu. Editor is vim – mohangraj Jul 23 '15 at 10:33
  • I am using Linux and shell is ksh and editor vi. You can test this on command prompt.run echo "My" , in output you will get next prompt in newline and run echo -n "My" or printf "My" , in output you will get prompt just after the My string. – Shravan Yadav Jul 23 '15 at 10:36
-1

You have 17 because of the /0 chaeracter.

BuZZ-dEE
  • 6,075
  • 12
  • 66
  • 96
Helper
  • 7
  • 1
  • You have a couple of typos here `/0` instead of `\0` and `chaeracter` versus `character`. The extra character being counted by **wc -c** isn't a null (`0`) it's a line terminator, likely a `\n`. In a DOS formatted file you'd get 18 because it would be a two byte line terminator `\r\n`. – Alain O'Dea Dec 02 '15 at 15:00