来自awk和nawk的不同结果

时间:2013-09-13 14:49:04

标签: unix awk nawk

我刚刚在一个拥有大约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

2 个答案:

答案 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那里可能会导致混乱。