awk 多文件合并,多列索引等操作

例 1? 索引

a.txt 文件内容如下:

b.txt文件如下

实行命令:

awk 'NR==FNR{a[$1]=$2}NR!=FNR{if($1 in a) print $1, a[$1], $2; else print $1, 0, $2}' a.txt b.txt

输出结果:

参数说明:

awk 'NR==FNR{a[$1]=$2}NR!=FNR{if($1 in a) print $1, a[$1], $2; else print $1, 0, $2}' a.txt b.txt

NR==FNR{a[$1]=$2}? : NR==FNR判断是否是第一个文件,如果是第一个文件实行 {a[$1]=$2 } 操作,将a.txt第一列作为key 第二列作为value生成索引a。 这一步实行后得出的结果大概是 a={'20000401':'100000999', '20100503':'100000888'} (实际上并不是json结构)

NR!=FNR{if($1 in a) print $1, a[$1], $2; else print $1, 0, $2} : 如果不是第一个文件, 这个例子中是指b.txt, 这段命令中 $1, $2 都是b.txt 中的第一、二列,逻辑很简单不说明了。

例 2. 统计

awk '{if (($3 >= 10 ) && ($3 < 20)) _cnt_10+=1; else _cnt_20+=1} END {print _cnt_10, _cnt_20}' res.txt

awk '{if (($3 >= 10 ) && ($3 < 20)) {_cnt_10+=1} else if($3>=0 && $3<10) {_cnt_1+=1} else {_cnt_20+=1}} END {print _cnt_1,_cnt_10, _cnt_20}' res.txt

结果:

awk + if ... else if ... else...

上面两个范围统计的例子原理不难, 主要是语法难记, 需要注意的是我的mac笔记本里不能用elif 报语法错误, 只能用else if 不知道怎么回事。

推荐阅读更多精彩内容

  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希翼更详细了解AWK...
    XKirk阅读 2,266评论 2赞 24
  • 1、Nginx日志分析日志格式:'$remote_addr - $remote_user [$time_local...
    运维前线阅读 251评论 0赞 4
  • 原文:http://521cto.blog.51cto.com/950229/945683 利用awk自身变量NR...
    ibadplum阅读 856评论 0赞 1
  • awk: grep,sed,awk grep:文本过滤 sed:文本编辑 awk:文本格式化工具; 1 什么是aw...
    木林森阅读 944评论 0赞 15
  • 本章主要学习内容awk先容 ?awk基本用法 ?awk变量 ?awk格式化 ?awk操作符 ?awk条件判断 ?a...
    楠人帮阅读 639评论 0赞 8