【问题标题】:Awk: substituting values in a column based on input from another fileawk:根据来自另一个文件的输入替换列中的值
【发布时间】:2012-04-08 04:55:23
【问题描述】:

我使用this question 中的 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”有点困惑。我假设它代表文件名。

【问题讨论】:

  • a 是数组变量的名称。 1{print} 的简写

标签: awk


【解决方案1】:

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

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

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

第一个文件没有打印的原因是因为第一个块中的next指令。

【讨论】:

  • 谢谢!我很欣赏详细的答案。这让我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2016-12-05
  • 2021-10-01
相关资源
最近更新 更多