【问题标题】:awk beginner trying to understand awk "thought process"awk 初学者试图理解 awk “思维过程”
【发布时间】:2016-07-29 06:40:58
【问题描述】:

相关问题是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 解释为给定条件的真值,并再次打印来自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.freeshell.org/AllAboutGetline
  • 感谢@Ed Morton 提供的信息。没有真正将它用于任何事情,只是学习。

标签: linux shell awk tcsh


【解决方案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 是一个始终为真的表达式,因此它匹配任何记录。它没有动作,所以默认动作是打印。这样,当前记录就被打印出来了,你会再次看到line 1

cat 第二次出现导致打印line 2getline 语法保留与其关联的开放流,因此同一 getline 表达式的多个求值读取连续行。 line 2 被打印两次,原因同上。

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

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 2019-04-11
    • 1970-01-01
    • 2011-03-30
    • 2017-10-03
    • 1970-01-01
    • 2013-07-16
    • 2020-12-11
    • 2016-01-05
    相关资源
    最近更新 更多