2016-07-28 34 views
0

相关问题是hereawk初学者试图了解awk“思维过程”

我有两个文件:

文件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

读行,如果catfile 2存在印刷生产线和1末告诉awk也从file 1打印线。如果没有找到cat,awk将从file 2中打印任何内容,但仍将打印file 1的相应行。

看上去正在发生的是awk读取file 1的第一行,找到cat并打印出第一行file 2。然后awk interperets 1作为一个真实的给定的条件,并再次打印从file 2的第一行。当awk没有找到cat它作为一个真正的1 interperates从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

希望这是一个学术问题,你并没有考虑在你的问题中实际使用任何脚本。如果是,请参阅http://awk.freeshell.org/AllAboutGetline。 –

+0

感谢@Ed Morton。不是真的把它用于任何事情,只是学习。 – thecomebackid

回答

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中读取记录,该记录取代当前的$0line 1。然后,第二条规则触发,它由1组成。 1是一个总是为真的表达式,所以它匹配任何记录。它没有任何操作,因此默认操作是打印。因此,当前记录被打印,并且您再次看到line 1

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

在第二个示例中,您使用的是读入指定变量名称的getline语法变体。因此,它并没有取代目前的纪录。当评估1规则时,当前记录仍为I am a cat,因此将会打印,而不是line 1line 2