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 2
。 getline
语法保留与其关联的开放流,以便对同一 getline
表达式的多次求值读取连续的行。 line 2
打印两次,原因同上。
在第二个示例中,您使用的是 getline
语法变体,它读入指定的变量名称。因此,它不会替换当前记录。当评估 1
规则时,当前记录仍然是 I am a cat
,因此它被打印出来,而不是 line 1
或 line 2
.
相关问题是
我有两个文件:
文件 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 2
。 getline
语法保留与其关联的开放流,以便对同一 getline
表达式的多次求值读取连续的行。 line 2
打印两次,原因同上。
在第二个示例中,您使用的是 getline
语法变体,它读入指定的变量名称。因此,它不会替换当前记录。当评估 1
规则时,当前记录仍然是 I am a cat
,因此它被打印出来,而不是 line 1
或 line 2
.