awk 初学者试图理解 awk "thought process"

awk beginner trying to understand awk "thought process"

相关问题是

我有两个文件:

文件 1:

I am a cat  
I am a dog    
I am a dog  
I am a cat  
I am a dog

文件 2:

line 1
line 2

执行时:

awk '/cat/{getline <"file2"; print};1' file1
line 1
line 1
I am a dog
I am a dog
line 2
line 2
I am a dog

我期待:

line 1
I am a cat
I am a dog
I am a dog
line 2
I am a cat
I am a dog

我对上面代码中awk的理解:

如果 cat 存在,则从文件 1 中读取行,打印来自 file 2 的行,末尾的 1 告诉 awk 也打印来自 file 1 的行。如果未找到 cat,awk 不会打印 file 2 中的任何内容,但仍会打印 file 1.

中的相应行

似乎正在发生的事情是 awk 读取 file 1 的第一行,找到 cat 并打印 file 2 的第一行。然后 awk 将 1 解释为给定条件的真值,并再次打印 file 2 的第一行。当 awk 找不到 cat 时,它会将 1 插入为 true 并从 file 1?

打印

我发现其他有趣的事情是当我 运行 这个:

awk '/cat/{getline this<"file2"; print this};1' file1  
line 1
I am a cat
I am a dog
I am a dog
line 2
I am a cat
I am a dog

这是怎么回事?谢谢你的时间。

awk '/cat/{getline <"file2"; print};1' file1
line 1
line 1
I am a dog
I am a dog
line 2
line 2
I am a dog

处理行 I am a cat 时,它匹配 /cat/。因此执行了操作。该操作从 file2 中读取一条记录,该记录将替换当前的 [=14=] line 1。然后,第二条规则触发,它由 1 组成。 1 是一个永远为真的表达式,所以它匹配任何记录。它没有任何操作,因此默认操作是打印。因此,打印了当前记录,您再次看到 line 1

第二次出现 cat 导致打印 line 2getline 语法保留与其关联的开放流,以便对同一 getline 表达式的多次求值读取连续的行。 line 2 打印两次,原因同上。

在第二个示例中,您使用的是 getline 语法变体,它读入指定的变量名称。因此,它不会替换当前记录。当评估 1 规则时,当前记录仍然是 I am a cat,因此它被打印出来,而不是 line 1line 2.