1、特殊变量:

NR:读取到所有记录(包括多个文件)的行数索引号(大概是Number Of Record的意思);
FNR:只的是awk所读取到的每个文件中的行数索引号,当文件发生切换时候,FNR重新从1开始,大概是File Number Of Record的意思;
NF:当前行中的字段个数(列数);

注:awk可以指定同时读取多个文件,按照指定的先后顺序,逐个读取。

FS:输入字段分隔符(默认值为空格)
OFS:输出字段分隔符(默认值为空格)
RS:输入记录分隔符(默认值为换行符)
ORS:输出记录分隔符(默认值为换行符)

2、NR和FNR区别:

1)对于单个文件NR 和FNR 的 输出结果一样的 ,例如:

# awk '{print NR,$0}' file1
1 a b c d
2 a b d c
3 a c b d#awk '{print FNR,$0}' file1
1 a b c d
2 a b d c
3 a c b d 

2)对于多个文件结果就不一样了,例如:

# awk '{print NR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
4 aa bb cc dd
5 aa bb dd cc
6 aa cc bb dd# awk '{print FNR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
1 aa bb cc dd
2 aa bb dd cc
3 aa cc bb dd

3)利用NR和FNR完成两个文件的关联Join:
有两个简单的文件

[liuxiaowen@getway tmp]$ cat a.txt
1,a-1
2,a-2
3,a-3
4,a-4
[liuxiaowen@getway tmp]$ cat b.txt
2,b-2
4,b-4
5,b-5

上面第一个命令中,awk只读取一个文件,因此NR和FNR是一样的;第二个命令有两个文件,从NR=5开始读取第二个文件b.txt。
由这点可以得出一个规则:当NR==FNR时候,读取到的内容为第一个文件的内容,当NR!=FNR时候,读取到的内容是第二个文件的。看下面的命令:

[liuxiaowen@getway tmp]$ awk -F',' 'NR==FNR{a[$1]=$2;}NR!=FNR{print $0,a[$1]}' b.txt a.txt
1,a-1
2,a-2 b-2
3,a-3
4,a-4 b-4

从输出的结果来看,已经将两个文件通过第一列的值join起来,准确的说是a.txt left outer join b.txt。解释一下这个命令:
第一部分:

NR==FNR{a[$1]=$2;}

a是一个数组;当NR==FNR,也就是读取第一个文件的内容(第一个文件就是后面的b.txt),以b.txt中的$1作为数组索引号,以b.txt中的$2作为数组的值;因此,第一部分过后,有了一个数组a,具体的值为 a[2]=”b-2″, a[4]=”b-4″, a[5]=”b-5″
再看第二部分:

NR!=FNR{print $0,a[$1]}

当NR!=FNR时候,也就是读取第二个文件的内容(a.txt),print $0(打印a.txt中的内容),以及a[$1],这里的含义是以a.txt中的$1为索引号,去数组a中获取值,因为之前数组a中的索引号有2,4,5;因此a.txt中第一列为2和4的记录从数组a中获取到了值,1,3,5在数组a中不存在。

如果是将两个文件做内关联:

[liuxiaowen@getway tmp]$ awk -F',' 'NR==FNR{a[$1]=$2;}NR!=FNR && a[$1] {print $0,a[$1]}' b.txt a.txt
2,a-2 b-2
4,a-4 b-4

变了一个条件:NR!=FNR && a[$1]
读取第二个文件的内容,并且第二个文件的$1在数组中存在,也可以写成 $1 in a

[liuxiaowen@getway tmp]$ awk -F',' 'NR==FNR{a[$1]=$2;}NR!=FNR && $1 in a {print $0,a[$1]}' b.txt a.txt
2,a-2 b-2
4,a-4 b-4

linux 文本处理 awk 几个特殊的内置变量相关推荐

  1. 命令 —— awk内置变量(NF,NR,FS,FILENAME)

    关于awk命令的几个内置变量(NF,NR,FS,FILENAME) 1.NF:支持记录域个数,在记录被读之后再设置例1 [root@redhat wilsontest]# pwd /tmp/wilso ...

  2. awk从入门到入土(23)awk内置变量ARGC、ARGC--命令行参数传递

    awk可以通过-v var=value的形式向awk脚本传递变量,除了这种方式之外,还可以直接在awk命令行上直接传递,如: $ echo a | gawk 'BEGIN{ for(i = 0 ; i ...

  3. linux awk 内置变量使用介绍

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...

  4. linux内置变量大全,(转)linux awk 内置变量使用介绍

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...

  5. linux awk 内置变量实例

    awk 是一门非常优秀的文本处理工具,甚至可以上升作为一门程序设计语言. 它处理文本的速度是快得惊人的,现在很多基于shell 日志分析工具都可以用它完成.特点是设计简单,速度表现很好,本文将介绍aw ...

  6. awk取文本列_awk命令结构/内置变量/获取文本某行或某列

    awk脚本基本结构 awk 'BEGIN{ print "start" }pattern{ commands }END{ print "end" }' file ...

  7. awk 内置变量与自定义变量

    点击上方"生信科技爱好者",马上关注真爱,请置顶或星标 作者:ghostwu 原文:https://www.cnblogs.com/ghostwu/p/9085653.html A ...

  8. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  9. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

最新文章

  1. python读取数据文件-python多种读写excel等数据文件的方式(收藏篇)
  2. JSP_通过表格显示数据库的信息
  3. MySQL中购买的语句,mysql操作语句 - 买灰机自己开的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. oracle util_mail,ORACLE UTL_MAIL 发送Email 无附件 有附件
  5. Windows下 Apache+PHP5+MYSQL5+phpmyadmin 规范安装
  6. [openjudge6043]哆啦A梦的时光机
  7. Android中通过ViewHelper.setTranslationY实现View移动控制(NineOldAndroids开源项目)
  8. 2020 OPPO 开发者大会重磅推出 ColorOS 11,适配机型达 33 种
  9. 数百万人都在使用的9款无线路由器易受226个缺陷影响
  10. 最近一周MOSS的link
  11. Tuxera NTFS 2021 for Mac(NTFS磁盘格式读写工具)
  12. C#的变迁史 - C# 5.0 之其他增强篇
  13. 【SSM分布式架构电商项目-32】Dubbo入门
  14. 基于ARM+FPGA低成本高实时Ethercat运动控制器解决方案
  15. ThinkpadX220 windows10 博通bcm94352hmb的蓝牙连接音箱播放声音断断续续的解决方案
  16. Buck电路工作原理
  17. php 中文字,完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8、GBK、GB2312)
  18. 关于vue的组件重新加载
  19. 微信小程序如何获取云存储中指定文件夹下所有图片
  20. Gmail和Orkut邀请自助发送[共享]

热门文章

  1. ci github 通知_初探CI,Github调戏Action手记——自动构建并发布
  2. NetDevOps — SNMP 协议
  3. Go 语言编程 — 并发 — Channel 通道
  4. MOS管好坏的判别方法
  5. NR 5G UE和5G网络功能之间的安全流程
  6. 2015年国际智慧教育展览会盛大开幕
  7. UVa 10290 - {Sum+=i++} to Reach N
  8. DevOps:软件架构师行动指南1.7 障碍
  9. C++生成随机数:负二项分布/帕斯卡分布(negative binomial distribution)
  10. android 牛人必修 ant 编译android工程