hld*_*ldn 4 awk text-processing join
我想创建一个包含来自两个输入文件的列的文件。文件 1 是这样的:
aa 32
bb 15
cc 78Run Code Online (Sandbox Code Playgroud)
文件2是:
fa 19
bc 23
cc 50
de 28
aa 45
bb 31Run Code Online (Sandbox Code Playgroud)
任务是,通读 File1,如果 File2 的第一个字段中存在一行的第一个字段,则打印 File2 的该行,包括两列,并添加包含第一个字段的 File1 的第二列条目。
输出应该是这样的:
aa 45 32
bb 31 15
cc 50 78Run 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}
NR是awk迄今为止已读取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 的值。