awk初学者试图理解awk“思维过程”

时间:2016-07-28 22:19:01

标签: linux shell awk tcsh

相关问题是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

这里发生了什么?谢谢你的时间。

1 个答案:

答案 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 1line 2