首页 > Linux操作系统 > Linux操作系统 > DOS,UNIX中的回车换行区别
这几天写了个多线程的数据抽取perl脚本,速度很快,可达到1G/m以上。可是今天做fastload加载时,被破了瓢冷水:
抽过来的所有的文件都无法正常的加载,表现的形式是我抽取的数据始终要比BOSS送过来的数据大那么一点点,但记录
条数没有异常。于是我开始了艰难的查错之旅:
结论:dos与unix在文件中换行字符的表现机置存在差异:
dos格式下,切换一行是二个字符的,由回车(od),换行(oa),文件尾部直接EOF(文件结束标志)
而unix下,切换一行,使用的是单换行符(oa),文件最后一行也会增加该字符,然后才是eof
验证如下:
windos下建一个文件,1.txt,输入:
afew
aef(到此打住)
使用ultraedit的十六进制查看,或者上传到unix机,使用:"xxd 文件名"以十六进制查看文件,结果如下:
0000000: 6166 6577 0d0a 6165 66 afew..aef
增加了Od,Oa二个字符
而在unix下,简单创建一个同样的文件:"vi 2.txt",输入
afew
aef(同样到此打住)
使用"xxd 2.txt" 查看:
0000000: 6166 6577 0a61 6566 0a afew.aef.
可以看到,第一行后边只有一个"oa" 换行符,同时最后一行也自动增加了oa字符
现在用wc查看下二个文件的情况:
>wc -l 1.txt 2.txt
1 2 9 1.txt
2 2 9 2.txt
3 4 18 total
可以看到,二个文件的字符数是一样的,这个上边已经分析.
使用UE转化工具dos2unix,功用是把dos的二个切换符转化成unix的单个字符
>dos2unix 1.txt
>wc 1.txt
1 2 8 1.txt
>xxd 1.txt
0000000: 6166 6577 0a61 6566 afew.aef
发现回车符已经被去掉了.,
同样使用转化工具unix2dos,功用是把unix下的单换行字符转化为dos下的二个字符:
>unix2dos 2.txt
>wc 2.txt
2 2 11 2.txt
>xxd 2.txt
0000000: 6166 6577 0d0a 6165 660d 0a afew..aef..
可以看到,二个单换行符已经转化成dos下的四个字符,文件大小也多了2个字符.
现在继续使用wc查看下这二个文件情况:
>wc 1.txt 2.txxt
1 2 8 1.txt
2 2 11 2.txt
3 4 19 total
现在文件的大小问题 ,已经换行符文题已经解决了,再来关注一下unix下一些工具所受到的影响 ,仔细看可以发现一个问题 :不管是什么格式的,在windows下生成的和在dos下生成的,行数都差一,dos下创建的文件最后一行哪里去了?没有统计到吗?
是的,的确没统计到,wc根据行未的oa字符判断的行数,所以结果是最后一行被忽略了.而dos2unix仅是对已有的0a/0d到oa之前的转化,对于windows下创建的文件进行dos2unix,也不会在最后一行里增加oa字符,所以即使用dos2unix后,文件wc结果也会少一行
同样受到影响的还有while语句
>while read line; do echo $line; done <1.txt
afew
可以看到,结果也只打出了一行,
sed就不受这个的影响了:
>sed 's/a/ccc/g' 1.txt
cccfew
cccef
再试awk命令:
>awk '{print $0}' 1.txt
afew
aef
也没有受到影响
目前常用到的shell命令,就是wc/while语句,受到影响.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16723161/viewspace-1016821/ ,如需转载,请注明出处,否则将追究法律责任。