AWK处理两个文件公共字段

在文件score.txt中存有如下数据:(姓名 分数)

lisi 88

bokeyuan 97

zhangsan 77

wangwu 89

hongliu 92

zhanghua 97

在文件student.txt中存有:

zhangsan

hongliu

 

使用awk, cut, grep, find等任意shell脚本,输出student.txt所有学生的分数,即输出:

zhangsan 77

hongliu 92

 

如果只在score.txt中处理,可以很容易得写出

awk ' { if ($1 == "zhangsan") print $0} ' score.txt

但是结合另外一个文件,该怎么处理呢?

 

求人不如求自己,到处找了找处理方法,可以使用awk来处理多个文件,答案如下:

 awk  ' {if (ARGIND==1) grade[$1] = $0}  {if (ARGIND>1 && ($1 in grade)) print grade[$1]} ' score.txt student.txt

简化版得写法为:

 awk 'ARGIND==1 {grade[$1]=$0}  ARGIND>1 && ($1 in grade) {print grade[$1]}' grade.txt student.txt

分析:

ARGIND==1处理第一个参数,即score.txt文件,或者用NR==FNR(

NR:表示awk开始执行程序后所读取的数据行数。

FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。

NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。

)

{grade[$1] = $0} 以grade.txt文件中的第一列为索引,将grade.txt中得内容存入grade数组中

if (ARGIND>1 && ($1 in grade)) print grade[$1] 如果处理的是第二个及以后的文件,即name.txt,检查第一列(姓名)是否在grade数组中,如果在,就打印以姓名为索引的grade信息。

猜你喜欢

转载自wangshuxing123-126-com.iteye.com/blog/2216680

相关文章