基于字段匹配合并 2 个文件

hld*_*ldn 4 awk text-processing join

我想创建一个包含来自两个输入文件的列的文件。文件 1 是这样的:

aa 32
bb 15
cc 78
Run Code Online (Sandbox Code Playgroud)

文件2是:

fa 19
bc 23
cc 50
de 28
aa 45
bb 31
Run Code Online (Sandbox Code Playgroud)

任务是,通读 File1,如果 File2 的第一个字段中存在一行的第一个字段,则打印 File2 的该行,包括两列,并添加包含第一个字段的 File1 的第二列条目。

输出应该是这样的:

aa 45 32
bb 31 15
cc 50 78
Run Code Online (Sandbox Code Playgroud)

awk 是脚本的首选。

Joh*_*024 10

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78
Run Code Online (Sandbox Code Playgroud)

解释:

awk隐式循环遍历每个文件,一次一行。由于我们将其file2作为第一个参数,因此首先读取它。 file1是第二次阅读。

  • FNR==NR{a[$1]=$2;next}

    NRawk迄今为止已读取FNR的行数, 是awk迄今为止从当前文件读取的行数。因此,如果FNR==NR,我们仍在读取第一个命名文件:file2。对于 中的每一行file2,我们分配a[$1]=$2.

    在此,a是一个关联数组a[$1]=$2保存文件2的第二列中的装置,表示$2在阵列中,作为值a使用file2中的第一列中,$1作为密钥。

    next告诉awk跳过其余的命令并从下一行重新开始。

  • ($1 in a) {print $1,a[$1],$2}

    如果我们到达这里,这意味着我们正在读取第二个文件:file1. 如果我们在 中看到file2由 array 的内容确定的行的第一个字段a,那么我们会从两个文件中打印出一行包含字段 2 的值。