linux - awk初学者试图理解awk "thought process"

标签 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 也打印文件 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/

相关文章:

linux - Linux 终端中的 For 循环

shell - 检查当月的最后一个星期六

使用 shell 脚本的 Java 代码格式化

bash - 在 AWK 中分配一个 Shell 变量

linux - 什么设置导致 catalina.out 被重命名为 catalina.out.1

linux - 防止 git 在 Linux 中没有 chmod 权限的文件系统上失败

c++ - 如何将 c/c++ 应用程序移植到旧版 linux 内核版本

java - 如何在 Linux 上查看/更改套接字连接超时?

bash - 使用 awk 转置 CSV 数据(枢轴转换)

linux - 如何以正确的方式使用 awk 中的命令