linux shell wc -c计数字符+1


17

我使用命令wc -c来计算字符数,但是它给了我一个错误的数字,例如字符数加一个:

echo "k" | wc -c 

它给了我两个字符

那么为什么不1?


3
-c选项是字节计数,而不是字符计数
mcalex12年

1
-m,--chars打印字符计数我也使用了同样的问题
Mohammad Karmi

没错,我以为unicode是每个字符两个字节,但是uni中的ascii字母仍然是1个字节。好奇。我在想EOL
mcalex

1
是的,我在文件中键入“ k”,它显示了2个字符,我删除了它,因此它显示了0个奇数
Mohammad Karmi 2012年

Answers:


19

查看有关的帮助消息wc。该-c选项打印出字符数。echo默认情况下,该命令包含换行符。当wc看到换行符时,它将其算作另一个字符,因此会在您的结果中额外计数。您可以使用下面显示的替代方法之一来解决此问题;-w计算单词-l数和行数。

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

您可以通过管道wc传递awk到的输出,以获取不包括换行符的字符数:

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

wc不带选项的默认输出按此顺序打印换行符的数量($ 1到awk),单词数和字符数($ 3到awk)。


好的,所以只有一个单词和一行,但是OP想要知道为什么会有两个字符/字节
mcalex

我想计算字符数,而不是单词或行数
Mohammad Karmi 2012年

6
嗯,所以你的意思是echo -n "k" | wc -c。这是有道理的
mcalex

我将char放入文件中,它给出了,以便EOF计数?或换行还是什么?,因为我想数一个以上的字符
Mohammad Karmi

2
@ user1865719:在一致性很重要printf之前echo,通常会优先使用。除非特别要求,否则它不打印换行符,因此printf "k" | wc -m给出1,即打印的字符数。要对文件第一行中的字符进行计数,可以执行例如$(($(head -1 file | wc -m)-1))(将其包装起来$(())以执行shell算术以除去换行数)或什至更好的方法:使用awk和do awk 'NR==1{print length}' file
Daniel Andersson

13

当您使用时echo "k"echo命令会将换行符附加到您要求打印的任何字符(“ k”)。您可以使用该-n选项禁用此功能:

echo -n k | wc -c
1

要查看该不可见字符,您可以转储流连odhd

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

这是因为您正在使用echo,这会在字符串中添加换行符。使用printf来代替:

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.