相关问题是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也会打印来自file 1
的行。如果找不到cat
,则awk不会从file 2
打印任何内容,但仍会从file 1
打印相应的行。
似乎正在发生的事情是awk读取file 1
的第一行,找到cat
并打印file 2
的第一行。然后awk将1
作为一个true与给定条件相互交织,并再次打印file 2
的第一行。当awk找不到cat
时,它会将1
作为一个真值并从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
这里发生了什么?谢谢你的时间。
答案 0 :(得分:1)
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
是一个始终为true的表达式,因此它匹配任何记录。它没有任何操作,因此默认操作是print。因此,打印当前记录,您再次看到line 1
。
第二次出现cat
会导致line 2
被打印。 getline
语法保留与其关联的开放流,以便对同一getline
表达式的多个评估读取连续行。由于与上述相同的原因,line 2
被打印两次。
在第二个示例中,您使用的getline
语法变量读入指定的变量名称。因此,它不能取代当前的记录。评估1
规则时,当前记录仍为I am a cat
,因此会打印,而不是line 1
或line 2
。