码迷,mamicode.com
首页 > 其他好文 > 详细

awk数组用法

时间:2014-08-21 19:37:17      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:awk

两个文件,从文件b首列查找出等于文件a的行并输出
[root@localhost ~]# cat a
1
3
6
7
[root@localhost ~]# cat b
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9

shell脚本
[root@localhost ~]# cat jieguo
#!/bin/bash
y=`sed -n ‘p‘ a |wc -l`  #a 行数
x=`sed -n ‘p‘ b |wc -l`  #b行数
for((i=1;i<=$y;i++))
do
   value_a=`sed -n ${i}p a`   #按行输出,赋值给a
  for((j=1;j<=$x;j++))
  do
    value_b=`awk ‘{print $1}‘ b|sed -n "/$j/p"`  #输出首列,赋值给b
 if [ "$value_a" = "$value_b" ]        #判断value_a,value_b是否相等
        then
          value_c=`sed -n ${j}p b`
          echo $value_c >> /root/value_c   #相等输出b中的行到value_c  
      fi
 done
done

awk命令行
awk ‘NR==FNR{k[$1]=$1} NR>FNR{ if(k[$1]==$1) {print $1,$2,$3}}‘ a b 或
awk ‘NR==FNR{k[$1]=$1} NR>FNR{ if(k[$1]==$1) {print $0}}‘ a b
NR:awk处理文件的总行数
FNR:awk处理当前文件的行数
数组k[$1]:将文件a的值付给数组k。

条件语句:NR==FNR 对文件a执行{}中的操作
                    NR>FNR  对文件b执行{}中的操作
                    k[$1]=$1中的$1是文件a中的第一个域
                    if(k[$1]==$1) {print $1,$2,$3}是文件b中的1,2,3个域
                    $0是当前的一条完整的记录

区别:

脚本:需要嵌套for来遍历整个文件,就是说我要比较a与b的首行是否相同的,需要a中每个数字循环遍历b中首行的数据。需要x*y次比较。

awk:数组k[$1]可以理解成将文件a的值由列变换成行,这样在awk做if判断时,是在一行数据中查找目标,而不需要像列一样需要for循环语句来遍历整个文件。就是从b的首行拿出数据与k数组作比较,数据相同,就输出。只需要比较x次。

运行结果:
[root@localhost ~]# ./jieguo
1 2 3
3 4 5
6 7 8
7 8 9
[root@localhost ~]# awk ‘NR==FNR{k[$1]=$1} NR>FNR{ if(k[$1]==$1) {print $0}}‘ a b
1 2 3
3 4 5
6 7 8
7 8 9

如果文件的行数有几万,几十万行,脚本是很费时的。awk秒出结果。。。

本文出自 “1058223494” 博客,请务必保留此出处http://4708705.blog.51cto.com/4698705/1543191

awk数组用法,布布扣,bubuko.com

awk数组用法

标签:awk

原文地址:http://4708705.blog.51cto.com/4698705/1543191

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!