相关问题是here .
我有两个文件:
文件 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的理解:
从文件 1 中读取行,如果 cat
存在,则从 file 2
打印行,最后的 1
告诉 awk 也打印文件 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
中读取一条记录,它替换了当前的 $0
line 1
。然后,第二条规则触发,它由 1
组成。 1
是一个永远为真的表达式,所以它匹配任何记录。它没有任何操作,因此默认操作是打印。因此,打印了当前记录,您又看到了第 1 行
。
cat
的第二次出现导致 line 2
被打印。 getline
语法保留与其关联的开放流,以便对同一 getline
表达式的多次求值读取连续的行。 line 2
打印两次,原因同上。
在第二个示例中,您使用的是 getline
语法变体,它读取指定的变量名。因此,它不会替换当前记录。当评估 1
规则时,当前记录仍然是 I am a cat
,因此它被打印出来,而不是 line 1
或 第 2 行
。
关于linux - awk初学者试图理解awk "thought process",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38647648/