我使用来自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”有点困惑。我假设它代表文件名。
答案 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
指令。