shell 之awk 关联数组高级应用

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

1101 123
1102 111
1103 145
1104 152

这是文本a.txt

文本b.txt如下

1101 123
1102 112
1103 154
1104 152

  列举的文本例子只是为了说明使用方法列举的最简单的文本,实际数据可能要复杂的多,可能会出现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 可以得到如下结果:

1101 123 123
1104 152 152

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

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

时间: 2024-09-30 20:55:16

shell 之awk 关联数组高级应用的相关文章

awk关联数组的下标

使用变量作为数组索引请参见范例 范例 $ cat employees Tom   Jones 4424 5/12/66 543354 Mary  Adams 5346 11/4/63 28765 Sally Chang 1654 7/22/54 650000 Billy Black 1683 9/23/44 336500 $ awk '{name[x++]=$2}END{for(i=0; i<NR; i++){print i,name[i]}}' employees 0 Jones 1 Adam

shell (awk)数组使用案例

1.取ifconfig eth0的IP地址 [[email protected] ~]$ ifconfig eth0 eth0      Link encap:Ethernet  HWaddr 00:0C:29:68:47:71 inet addr:192.168.48.144  Bcast:192.168.48.255  Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe68:4771/64 Scope:Link UP BROADCAST RUNN

shell 常规数组&关联数组

在日常编写shell的过程中,数组是一个非常常用到的内容.我们这里简要介绍两种数组的使用方式.一种常规数组,一个中关联数组.差异就是常规数组,只能用整数作为下标来进行数据的存取.而关联数组能够使用字符作为小标来进行存储. 常规数组 1)  初始化 数组中的多个变量用括号来括起来,变量间用空格来间隔开来. [email protected]:~/test_shell#./demo1.sh 1 2 3 4 5 1 2 3 4 [email protected]:~/test_shell# mored

shell 脚本-关联数组

shell 的关联数组 Shell Associative Array   bashi没有原生的对于类似hash table的支持,不像perl或python.下标数组元素是通过数组下标(数组下标可以是算术表达式,其结果必须是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时会存在限制.shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素.这种数组叫做关联数组(associative array).关联数组的下标和值称为键值对,它们是一一对应的

shell实现关联数组

*/--> shell实现关联数组 用 shell 编写数组的输入输出;有一个文件,第一列存主机名,第二列为 IP 地址,如何输入 主机名返回 IP 地址,shell 编写实现: while read host ip; do eval ${host}=${ip} done # 这样就可以直接 echo ${主机名} 了。 一个文件只有 1 列数据,如何用 shell 求这 1 列数据的加和: while read n; do sum=$((sum + n)); done echo $sum Da

shell关联数组

Shell Associative Array    bashi没有原生的对于类似hash table的支持,不像perl或python.下标数组元素是通过数组下标(数组下标可以是算术表达式,其结果必须是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时会存在限制.shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素.这种数组叫做关联数组(associative array).关联数组的下标和值称为键值对,它们是一一对应的关系.在关联数组中,键

shell之数组和关联数组

数组和关联数组 #!/bin/bash #定义数组1 array_var1=(1 2 3 4 5 6)# #定义数组2 array_var[0]="test1" array_var[1]="test2" array_var[2]="test3" array_var[3]="test4" array_var[4]="test5" array_var[5]="test6" #打印指定索引的元

AWK文本处理增强shell功能--AWK完全手册

AWK是一种优良的文本处理工具.它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一. 本文主要摘录池中龙写的Unixawk使用手册(第二版),对其中内容稍微改动.感谢作者的分享. 目 录 1 0作者的话 2 1awk的调用方式 3 2awk的语法 4 3awk的记录.字段与内置变量 5 4awk的内置函数 5 5在命令行使用awk 6 6awk的变量 7 7运算与判断 7 8awk的流程控制 8 8.1BEGIN和END: 8 8.2流程控制语句 9 8.2.1if...e

AWK增强的文本处理shell特征--AWK完全手册

AWK这是一个很好的文字处理工具. 它不仅 Linux 中也是不论什么环境中现有的功能最强大的数据处理引擎之中的一个. 本文主要摘录池中龙写的Unixawk使用手冊(第二版),对当中内容略微修改.感谢作者的分享. 目 录 1 0作者的话 2 1awk的调用方式 3 2awk的语法 4 3awk的记录.字段与内置变量 5 4awk的内置函数 5 5在命令行使用awk 6 6awk的变量 7 7运算与推断 7 8awk的流程控制 8 8.1BEGIN和END: 8 8.2流程控制语句 9 8.2.1