awk中的变量(r4笔记第93天)
awk和sed结合起来,对于文件的横向纵向处理几乎是全方位的,可以算是文本处理中的大招了。当然awk这一强大的分本处理工具也不是浪得虚名,功能丰富,学习周期也要长些,不是一个Help文档就能说完的。学习awk可以算得上重新学习一门编程语言,因为里面的东西确实太多了。我们就按部就班,循序渐进,先来说说awk中的变量。
关于awk中的变量,有内置变量和自定义变量。
内置变量如果细分,有数据字段和数据行变量,数据变量,可能看概念不好理解。我们一个一个说明。
数据字段和数据行变量主要有
FIELDWIDTHS 会根据字段的长度来划分,比如20150401.223300 如果我们指定FIELDWIDTHS为3 5 3 4 则输出为201 50401 .22 3300
FS 这个是输入字段的分隔符,比如 11,12,13 如果指定FS为, 就会把11,12,13分隔为 11 12 13
OFS 这个是输出字段的分隔符,比如 11,12,13 如果我们按照,分隔,数据会为11 12 13,我们指定OFS为“--”,则输出为11--12--13
RS 这个是输入数据行的分隔符,使用的场景较为特殊,在下面通过例子来说明。
ORS 这个是输出数据行的分隔符,使用的场景较为特殊,通过例子来说明。
我们指定一个文件 a.lst,还是举个pm2.5的例子。以下是近些天的pm2.5的数据
2015 03 30 100
2015 03 31 150
2015 04 01 70
? awk 'BEGIN{FS=" "}{print $1 $2 $3}' a.lst
20150330
20150331
20150401
注意下面两种写法的差别。
? awk 'BEGIN{FS=" " ;OFS="--"}{print $1 $2 $3}' a.lst
20150330
20150331
20150401
? awk 'BEGIN{FS=" " ;OFS="--"}{print $1,$2,$3}' a.lst
2015--03--30
2015--03--31
2015--04--01
关于RS和ORS的使用可以使用下面的例子。
假设我们存在下面的文件,每隔3行数据就来一个空行。我们可以选择性的截取数据字段的值
? cat a.lst
2015line1 03 30 100
2015 03 31 150
2015 04 01 70
2015line2 03 30 100
2015 03 31 150
2015 04 01 70
2015line3 03 30 100
2015 03 31 150
2015 04 01 70
? awk 'BEGIN{FS="n"; RS=""}{print $1,$3}' a.lst --这个地方,我们使用RS来分隔数据行,以空行为分界,在这个基础上按照回车划分每一列数据。
2015line1 03 30 100 2015 04 01 70
2015line2 03 30 100 2015 04 01 70
2015line3 03 30 100 2015 04 01 70
这样就把第1行,第3行的数据整合到了一起。按照这个规律下面的数据也是这样的形式。
如果使用ORS来,结果会大不相同,我们以“--”作为输出的分隔符。
? awk 'BEGIN{FS="n"; ORS="----"}{print $1,$3}' a.lst
2015line1 03 30 100 ----2015 03 31 150 ----2015 04 01 70 ---- ----2015line2 03 30 100 ----2015 03 31 150 ----2015 04 01 70 ---- ----2015line3 03 30 100 ----2015 03 31 150 ----2015 04 01 70 ---- ---- ----
对于数据变量,可能使用的地方相对要少一些。内建变量比如:
ARGC 代表当前命令行的参数个数
ARGV 包含命令行参数的数组
ENVIRON 代表当前shell环境变量和值组成的关联数组
NF 代表数据文件中的字段总数
NR 是已处理的输入数据行数目
举几个例子。
? awk 'BEGIN{print ARGC,ARGV[0],ARGV[1]}' a.lst
2 awk a.lst
其中ARGC是命令行的参数个数,可以看到两个参数的值分别为awk和a.lst,下标从0开始
? awk '{print ENVIRON["HOME"] ,ENVIRON["PATH"]}' a
/home/mobaxterm /bin:/bin:/drives/c/WINDOWS:/drives/c/WINDOWS/system32
自定义变量的部分是平时使用频率比较高的,这个部分的灵活性还是很大的。基本上有以下几个场景。 在脚本中给变量赋值,在命令行上给变量赋值
脚本中给变量赋值,比如我们指定一个变量test,然后初始化两次,变量值都会动态变化
? awk '
> BEGIN{
> test="first_try"
> print test
> test="second_try"
> print test
> }'
first_try
second_try
对于命令行中给变量赋值,可以这么理解。
? cat a.lst
2015line1 03 30 100
2015 03 31 150
2015 04 01 70
? awk 'begin{FS=" "}{print $n}' n=3 a.lst
30
31
01
这种情况下,会根据设置的变量值,动态赋予n=3
如果需要传递shell变量的值,可以通过-v选项来实现
? awk -v n=3 '{print "this is a test",n}' a
this is a test 3
test=aaaaa
echo $test
aaaa
? awk -v t=$test '{print "testing value:" t}' a.lst
testing value:aaaa
testing value:aaaa
testing value:aaaa
- Apache 压力测试工具ab
- SQL之收集SQL Server线程等待信息
- 聚合索引(clustered index) / 非聚合索引(nonclustered index)
- 域名资讯:单词域名can.com以15.5万美金成功交易
- jQuery无缝图片横向(水平)/竖向(垂直)滚动
- Centos下MooseFS(MFS)分布式存储共享环境部署记录
- MFS+Keepalived双机高可用热备方案操作记录
- Docker容器学习梳理-容器时间跟宿主机时间同步
- AS1.0(2.0)中的XML示例
- kvm虚拟机日常操作命令梳理
- mongodb 总结
- 关于微信小程序内置组件swiper,circular使用分享
- zabbix问题记录
- MSDTC 故障排除
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你掉的是这个免费服务器,还是这个 Docker 实验平台
- 我能赢吗
- 最长公共子串/序列问题
- 个性化终端 | zsh bash oh-my-zsh
- VirtualBox无限嵌套方法 | 虚拟机套娃
- Win10 LTSC 激活方法 | Win10专业版(永久激活)长期服务版 LTSC 2019密钥
- Nginx代理以及面向未来的HTTP
- git的基本使用
- 一、玩转Git三剑客-Git基础
- Docker和k8s的故障排除和监控利器 Weave-Scope服务
- docker 配置Consul+registrator实时服务发现
- 使用Docker搭建Zookeeper集群
- GDCRNATools内置的gdc-client不好用
- 字符编码与字符串表达式
- 关于批次效应矫正后出现负值