linux的wc -l 命令统计文件少一行

wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出



格式:wc file



命令参数:



-c 统计Bytes数(字节数),并显示文件名



-l 统计行数:使用换行符‘\n’作为行结束标志,实际是统计换行符个数



-m 统计字符数。这个标志不能与 -c标志一起使用。



-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。



-L 打印最长行的长度。



-help 显示帮助信息



–version 显示版本信息



 



实例:



wc test.txt



6  24 132test.txt



默认输出:行,字数,字节数



 



test.txt内容



Cat test.txt



test1 name1 age1 sex1



test2 name2 age2 sex2



test3 name3 age3 sex3



test4 name4 age4 sex4



test5 name5 age5 sex5



test6 name6 age6 sex6

问题:wc 统计行数时少一行:
因为wc –l是按\n作为行结束符统计行数,所以最后一行如果没有\n的话会统计丢失。



实例:比如,在windows下生成同上面test.txt相同的文件testtt.txt,上传到linux下:



cat testtt.txt



test1 name1 age1 sex1



test2 name2 age2 sex2



test3 name3 age3 sex3



test4 name4 age4 sex4



test5 name5 age5 sex5



test6 name6 age6 sex6[wizad@srv26 lmj]$



可以看出结尾有点奇怪。这是因为文件末尾无\n,而是直接用了文件结束符EOF。这样文件使用wc统计就会少一行:



wc -l testtt.txt



5 24 136 testtt.txt



使用管道也不行:










cat testtt.txt wc -l


5



 



为什么linux下没有这样的问题?
         因为vim编辑器会自动在文件结尾加上\n,在加上文件结束符EOF。(linux下文本文件主要按处理,所以vim会末行自动加\n)



 



而对windows文件用dos2unix转化也不行:
[wizad@srv26 lmj]$ dos2unix testtt.txt



dos2unix: converting file testtt.txt toUNIX format …



[wizad@srv26 lmj]$ wc testtt.txt



5  24131 testtt.txt



可以看出windows文件在linux下还是有兼容问题的。文件字数没变24,byte数少5个是windows下行结束符是回车\r+换行\n。而linux下只是换行\n



Vim二进制可以看到不同,\n显示为.,文件结尾没有


Category linux