Awk:根据另一个文件的输入替换列中的值

时间:2012-03-23 15:58:55

标签: awk

我使用来自this问题的awk one liner解决了类似的我的问题。然而,不是真的知道Awk我不知道它是如何工作的。任何人都可以解释脚本的功能吗?我想了解它,以便我可以在不同情况下应用它。

以下是链接中的一个班轮:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1

我知道FNR=NR部分确保文件1中的行与文件2中的相同行号相匹配。显然,$ 3和$ 2分别对应于第三和第二个字段。但我很困惑代码末尾的“1”,我对“a”有点困惑。我假设它代表文件名。

1 个答案:

答案 0 :(得分:2)

awk将逐行处理每个文件。 Awk将跟踪当前文件(FNR变量)中的当前行号以及到目前为止看到的总行数(NR变量)。只有当awk正在读取第一个文件时,条件FNR==NR才能成立。

a[NR]=$3设置在NR处索引的数组元素以保存第三个字段的值。

awk程序主要由condition {action}对组成。对于当前行,检查每个条件,如果为true,则执行动作块。如果缺少条件,则将执行操作块 - 这是{$2=a[FNR]}块的情况。如果条件存在但动作块不存在,则默认操作是打印$ 0,这是任何转换后的当前行。由于非零数字等于true,因此1指示awk为每一行执行默认操作。

未打印第一个文件的原因是由于第一个块中的next指令。