awk如何处理输入文件?

awk如何处理输入文件?,awk,Awk,我想知道awk的“内部”是如何工作的 当awk运行时,它是将输入文件完全加载到内存中还是逐块读取文件?说到文件,特别是,awk将首先读取程序,解释它,然后将它应用到文件的每一行,一行一行-实际上,只有当RS是默认值时,这才是严格正确的。多行解析需要进行更深入的分析。请参见下文(斜体): 1.4有两条规则的示例 awk实用程序一次读取一行输入文件。对于每一行,awk都会尝试每一行的模式 规则。如果多个模式匹配,则在 它们在awk程序中出现的顺序。如果没有匹配的模式, 然后就不会运行任何操作 在处理

我想知道awk的“内部”是如何工作的


当awk运行时,它是将输入文件完全加载到内存中还是逐块读取文件?

说到文件,特别是,
awk
将首先读取程序,解释它,然后将它应用到文件的每一行,一行一行-实际上,只有当RS是默认值时,这才是严格正确的。多行解析需要进行更深入的分析。请参见下文(斜体):

1.4有两条规则的示例 awk实用程序一次读取一行输入文件。对于每一行,awk都会尝试每一行的模式 规则。如果多个模式匹配,则在 它们在awk程序中出现的顺序。如果没有匹配的模式, 然后就不会运行任何操作

在处理所有与该行匹配的规则之后(可能还有 如果没有),awk读取下一行

也看到

7.4.8下一个声明 [……]

在最高级别,awk程序执行是一个读取 输入记录,然后根据它测试每个规则的模式。如果你 将此循环视为for语句,其主体包含规则, 接下来的语句类似于continue语句。它跳过 到该隐式循环体的末尾,并执行 增量(读取另一条记录)

但是,如果使用记录分隔符来跨越更多的行呢

4.1如何将输入拆分为记录 awk将程序的输入分为记录和字段。信息技术 跟踪到目前为止从中读取的记录数 当前输入文件。此值存储在预定义变量中 称为FNR,每次启动新文件时都会将其重置为零

由于我们发现
awk
一次只读取一行文件(实际上是一条记录),我们来看看
getline()
函数:

getline命令在找到记录时返回1,在找到记录时返回0 遇到文件的结尾。如果在获取 记录,例如无法打开的文件,然后getline返回-1。 在本例中,gawk将变量ERRNO设置为描述 发生的错误


指令由解释器解释和执行,解释器尝试从文件中读取新内容。由于这是一个函数,它会相应地返回结果:awk可能无法再访问输入文件,导致
-1
ERRNO

基于正则表达式的字段和记录分隔符(许多人认为只是列和行)的优点是,仅通过设置

RS=“^$”

你可以一次看完整个文件。有一次,我滥用mawk2到了极限,将1200万行、3列(900MB的文本中填充了Unicode)的内容展平,强制将其加载为一行(通过设置FS=“[=\n]”*

看着它不出一身冷汗,带着超过3600万的NF回来,真是太有趣了=p

  • 我非常懒惰,所以我只发现一个简单的角色,在歌曲和艺术家的名字中出现最少,在任何场景中都不需要逃避,在终端取消引用并跟随它时,不会造成任何危险。如果我必须处理FPAT,我会尖叫
因此,我选择了等号,并使用蛮力将歌曲名称中现有的等号重新转换为unicode双宽度表


通过这种方式,它也有助于避免在存储时在任何文本文件中引用字符串。

awk开始读取输入并根据RS对其进行解析。一旦读取了RS(或EOF),解释程序将针对该记录执行。完成后(或进行
next
getline
调用),再次对输入进行采样,直到出现新的RS或EOF@edmorton我知道,我的评论是在除了台词之外的任何东西被提及之前发表的。我会一块一块地删除它。