3

我只是在一个包含大约 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
4

2 回答 2

7

The difference probably lies on the buffer limit of Nawk. One of the records (lines) found in your input file has probably exceeded it.

This crucial line can be found in awk.h:

#define RECSIZE (8 * 1024)  /* sets limit on records, fields, etc., etc. */
于 2013-09-13T15:18:02.937 回答
2

您的命令可以简化为:

awk 'substr($0,472,1)==9'

在默认情况下运行的 Solaris(您正在运行)上,您运行awk的是旧的、损坏的 awk (/usr/bin/awk),所以我怀疑 nawk 是产生正确结果的那个。

使用相同的脚本/参数运行 /usr/xpg4/bin/awk 并查看它的输出与您的其他哪些结果一致。

此外,通过在其上运行 dos2unix 检查您的输入文件是否是在 Windows 上创建的,并查看它的大小是否发生变化,如果是,请在修改后的文件上重新运行 awk 命令。如果它是在 Windows 上创建的,那么其中会有一些可能导致混乱的 control-M。

于 2013-09-13T17:09:31.203 回答