awk数组用法

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

shell脚本
[[email protected] ~]# 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次。

运行结果:
[[email protected] ~]# ./jieguo
1 2 3
3 4 5
6 7 8
7 8 9
[[email protected] ~]# 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秒出结果。。。

awk数组用法

时间: 2024-10-25 02:18:39

awk数组用法的相关文章

awk基本用法

RS,ORS,FS,OFS,NR,NF,$0,$n RS 输入的行分隔号 ORS 输出的行分隔号 FS 输入的列分隔号 OFS 输出的列分隔号 NR 行号 NF 尾列号 $0 表示所有列(整行) $n 表示第n列 例如: shell> cat aa 1 2 3 4 5 6 shell> awk 'BEGIN{ORS=",\n"}{print}' aa 1 2, 3 4, 5 6, RS反之 shell> awk 'BEGIN{ORS=",\n"}{

Linux sed 和 awk的用法

sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] 'command' 输入文本 常用选项:        -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自

AWK详细用法

awk非常的优秀,运行效率高,而且代码简单,对格式化的文本处理能力超强.基本上grep和sed能干的活awk全部都能干,而且干得更好. 先来一个很爽的例子:文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值.用awk来实现只需要一句话就可以搞定(当然,这个东东用python也可以很轻松的实现,只是无论如何都得新建一个文件:别妄想用bash shell来做,那可是浮点数!!!)$cat a1.021 331#.ll   442.53 6ss    7awk 'BEGIN{total = 0;

初学awk数组会遇到的几个常见问题

原题目: 处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题) 答案的详细讲解请参考: http://lidao.blog.51cto.com/3388056/1912219 文件内容: http://www.etiantian.org/index.html http://www.etiantian.org/1.html http://post.etiantian.org/index.html http://mp3.etiantian.org/index.html h

awk入门及awk数组相关实战

知识点: l 记录与字段 l 模式匹配:模式与动作 l 基本的awk执行过程 l awk常用内置变量(预定义变量) l awk数组(工作常用) l awk语法:循环.条件 l awk常用函数 l 向awk传递参数 l awk引用shell变量 l awk小程序及调试思路 [[email protected] ~]# awk --version|head -1 GNU Awk 3.1.7 第1章 记录和字段 record记录==行, field字段相当于列,字段==列. awk对每个要处理的输入数

awk,sed用法

1.分组求和,第一列相同,第二列数值加和 采用awk数组处理,其中,$1为数组下标,a[$1]为对应数组名,即当行中$1相同时,为同一数组,则对应的列值加和 awk '{a[$1]+=$2}END{for(i in a){print i","a[i]}}' fileName

shell数组和awk数组

awk终于能入门了,所以整理了该文章,内容大多来自网上. 一.bash支持一维数组(不支持多维数组),没有限定数组的大小.在shell中,用括号来表示数组,数组元素用空格符号分割开.类似于C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0 1. 定义数组 数组名array,元素a b c [[email protected]~]# array=(a b c) 2.获取所有元素 [[email protected]~]# echo ${a

awk基本用法(一)

awk从FILE中读取文件,并采用指定的分隔符(默认为空格),将其分为多个段,每一个段的内容都放在$n(n为数字)中.$0表示一整行的内容. awk的用法: awk 'PATTERN{ACTION}' FILE 说明: PATTERN:为匹配模式.如果没有PATTERN,则表示匹配所有. ACTION:对匹配的内容所执行的操作.最简单的ACTION为print 内置变量: NF:表示的是Number of Field,即字段个数.如果是$NF,则表示的是最后一个字段. 示例1: [[email 

awk 数组理解与应用

awk 数组无须实现定义 ckl[abc]=6 ckl[xyz]=9 abc 为下标名称 9 则为下标对应的值 BEGIN 为模式前匹配,即为匹配之前操作 END 为模式匹配后,即为匹配后操作 如常用的统计TCP状态的awk命令 # netstat -ant | awk '/^tcp/{STA[$NF]++}END{for ( k in STA) {print k,STA[k]}}' TIME_WAIT 4 CLOSE_WAIT 19 FIN_WAIT2 1 ESTABLISHED 135 LA