shell 之awk 关联数组高级应用

时间:2023-12-15 11:48:38

  最近由于数据迁移过,有些用户信息需要再次确认下,也许数据量比较大,但是需要最终确认的比如说是用户ID和其对应的用户积分数,这样就会导致出现文本a(老的数据),文本b(新的数据)。比如


这是文本a.txt

文本b.txt如下


  列举的文本例子只是为了说明使用方法列举的最简单的文本,实际数据可能要复杂的多,可能会出现b.txt 中出现的ID在a.txt中没有出现等等情况,这里只是为了说明awk 关联数组的高级应用,方便大家理解。

  我们会发下b.txt中的ID 为1102 和1103 用户的积分数与先前的是不同的,那么如何通过shell 来处理呢?下面介绍强大的文本工具awk:

  提取两个文本中第二列相同并将积分进行合并:

  awk 'NR=FNR{a[$1]=$2}NR!=FNR{$2==a[$1] print $0,a[$1]}' a.txt b.txt 可以得到如下结果:

  

  其中NR,FNR都为awk的内置的数据变量,其中NR为含处理过的所有的数据行总数,FNR为处理过的当前数据文件中的数据行的总数。简单的来说可以这么理解NR为执行读取两个文本行的总数,而FNR为读取第一个文本行的数量,所以判断条件可以通过“!=”也可以通过“>”来判断。而a[$1]=$2为将第一个文本行中第二个字段赋值给数组a,然后当处理到第二个文本时,可以利用已经赋值的数组进行判断进行有条件的输出。

  然后第二列积分数不同的以此类推即可。