【问题标题】:Different results from awk and nawkawk 和 nawk 的不同结果
【发布时间】:2013-09-13 14:49:04
【问题描述】:

我刚刚在一个包含大约 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 中正确的记录数 IE。; 6000 万,但 nawk 命令只给出 420 万。

我很困惑,想知道是否有人遇到过这样的问题。这个简单的命令究竟是如何在内部以不同的方式处理的?在使用 nawk 时,是否有一个缓冲区最多只能容纳一定数量的字节?

如果有人能对此有所了解,将不胜感激。

我的操作系统详细信息是

SunOS <hostname> 5.10 Generic_147148-26 i86pc i386 i86pc

【问题讨论】:

  • 如果命令没有以某种方式失败,可能是 nawk 中的缓冲区设置为限制。
  • 您能否改写您的问题以消除&gt;&gt; 附加到file2.txt 中?也许有 nawk 版本&gt; file3.txt?我假设您意识到这种情况正在发生,但是鉴于您的代码示例,您报告的内容不可能是真的。您是否尝试过nawk '...' file1.txt &gt; file2.txt,消除重定向到脚本?应该没什么区别,但值得一试。另外,我会检查 4.2mill+1 记录点的原始数据,并确保文件中没有一些奇怪的字符,再次,这不重要,但是??。祝你好运。
  • @shellter,我试过用 nawk '{if(substr($0,472,1)=="9") print $0}' file3.txt,结果是一样的。 4.2m+1 似乎也是正确的,它被 awk 捕获但不是 nawk。
  • @konsolebox 有没有办法检查缓冲区限制?
  • @konsolebox : 什么缓冲区限制?除了行大小, nawk (应该)一次处理一行,对吗?过去,我曾经使用 nawk 处理具有约 10 条轧机线的文件,并且希望它适用于任意数量的线。 @Ankit:请向我们展示which awkwhich nawk 的结果。祝大家好运!

标签: unix awk nawk


【解决方案1】:

差异可能在于 Nawk 的缓冲区限制。在您的输入文件中找到的一条记录(行)可能已经超出了它。

这条关键线可以在awk.h找到:

#define RECSIZE (8 * 1024)  /* sets limit on records, fields, etc., etc. */

【讨论】:

  • 每天学习一些东西!仍然希望看到@Ankit 正在访问哪个awk,如果是/usr/bin/awk,我真的会感到惊讶,而如果是/usr/xpg4/bin/awk,那就很有趣了。另外,我不认为netbsd.org 的东西与“SunOS 5.10”中的nawk 相同,但我也可能错了;-! ) 祝大家好运。
  • @Ankit 你写了'记录长度是 482'。 (8 * 1024) 的记录是有效记录似乎不正确。祝你好运。
  • 我同意@shelter。如果每行的长度是 482 个字符,那么这不超过任何一条记录的缓冲区大小。此外,如果每条记录的大小相同,那么它们都将超过缓冲区大小,而不仅仅是其中一些。这里还有其他事情发生。
  • 我承认我实际上并不介意(没有注意到)记录长度(指定的长度)。我一直在考虑更多的行数(6000 万/420 万),并且在如此大的数量上,其中一些行可能比普通行长。我同意,虽然看到了笔记,但可能还有另一种可能性。
  • @konsolebox 所以解决方案是编辑这个 .h 文件?
【解决方案2】:

您的命令可以简化为:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多