我刚刚在一个拥有大约2.5亿条记录的文件上运行了这两个命令。
awk '{if(substr($0,472,1)=="9") print $0}' < file1.txt >> file2.txt
和
nawk '{if(substr($0,472,1)=="9") print $0}' < file1.txt >> file2.txt
记录长度为482.第一个命令在file2.txt中给出了正确的记录数 即; 6000万,但是nawk命令只提供了420万。
我很困惑,想知道是否有人遇到过这样的问题。这个简单的命令究竟是如何在内部以不同的方式处理的?是否有一个缓冲区在使用nawk时只能保存一定数量的字节?
如果有人可以对此有所了解,会很感激。
我的操作系统详情
SunOS <hostname> 5.10 Generic_147148-26 i86pc i386 i86pc
答案 0 :(得分:7)
差异可能在于Nawk的缓冲限制。输入文件中找到的记录(行)之一可能超出了它。
这个关键线可以在awk.h中找到:
#define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */
答案 1 :(得分:2)
您的命令可以简化为:
awk 'substr($0,472,1)==9'
在Solaris上(你所在的)默认运行awk
时,你运行的是旧的,破坏的awk(/ usr / bin / awk),所以我怀疑nawk是产生正确结果的那个。 / p>
使用相同的脚本/参数运行/ usr / xpg4 / bin / awk,并查看其输出结果与您的其他结果一致。
另外,检查输入文件是否是在Windows上创建的,方法是运行dos2unix并查看其大小是否发生变化,如果是,请在修改后的文件上重新运行awk命令。如果它是在Windows上创建的,那么它会有一些控件-Ms那里可能会导致混乱。