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}
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 的值。