【译】 AWK教程指南 附录D-AWK的内置变量
因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列。
- ARGC
ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数。若将"awk程序"直接写在命令列上,则 ARGC 亦不将该"程序部分"列入计算。
- ARGV
ARGV数组用以记录命令列上的参数。
例:执行下列命令
$ awk -F\t -v a= -f prg.awk file1.dat file2.dat
或
$ awk -F\t -v a= '{ print $1 * a }' file1.dat file2.dat
执行上述任一程序后
ARGC = 3
ARGV[0] = "awk"
ARGV[1] = "file1.dat"
ARGV[2] = "file2.dat"
读者请留心:当 ARGC = 3 时,命令行上仅指定了 2 个文件。
注:
-F\t 表示以 tab 为字段分隔字符 FS(field seporator)。
-v a=8 用以初始化程序中的变量 a。
- FILENAME
FILENAME用以表示目前正在处理的文件的文件名。
- FS
字段分隔字符。
- $0
表示目前awk所读入的数据行。
- $1,$2..
分別表示所读入的数据行的第一个字段,第二个字段,...(参考下列说明)
当awk读入一行数据 "A123 8:15" 时,会先以$0 记录,故 $0 = "A123 8:15"。若程序中进一步使用了 $1, $2.. 或 NF 等内置变量时,awk才会自动分割 $0以便取得字段相关的数据,切割后各个字段的数据会分別以$1, $2, $3...记录。
awk缺省(default)的 字段分隔字符(FS) 为 空白字符(空格及tab)。以本例而言,读者若未改变 FS,则分割后:
第一个字段($1)="A123", 第二个字段($2)="8:15"。
使用者可用正则表达式自行定义 FS。awk每次需要分割数据行时,都会参考目前FS的值。
例如:
令 FS = "[ :]+" 表示任何由 空白" " 或 冒号":" 所组成的字串都可当成分隔字符,则分割后:
第一个字段($1) = "A123",第二个字段($2) = "8",第三个字段($3) = "15"
- NR
NR 表示从 awk 开始执行该程序后所读取的数据行数。
- FNR
FNR 与 NR 功用类似,不同的是awk每打开一个新的文件,FNR 便从 0 重新累计。
- NF
NF表示目前的数据行所被切分的字段数。awk 每读入一行数据后,在程序中可用 NF 来得知该行数据包含的字段个数。在下一行数据被读入之前,NF 并不会改变。但使用者若自行使用$0来记录数据,例如:使用 getline,此时 NF 将代表新的 $0 上所记载的数据的字段个数。
- OFS
输出时的字段分隔字符。缺省为 " "(一个空白),详见下面说明。
- ORS
输出时数据行的分隔字符。缺省为 "\n"(换行),见下面说明。
- OFMT
数值数据的输出格式。缺省为 "%.6g"(若须要时最多打印6位小数)
当使用 print 指令一次打印多项数据时,
例如:print $1, $2
输出时,awk会自动在 $1 与 $2 之间补上一个 OFS 的值(缺省为一个空白)。
每次使用 print 输出后,awk会自动补上 ORS 的值(缺省为换行符)。
使用 print 输出数值数据时,awk将采用 OFMT 的值为输出格式。
例如:
$ awk 'BEGIN { print 2/3,1; OFS=":"; OFMT="%.2g"; print 2/3,1 }'
输出:

程序中通过改变OFS和OFMT的值,改变了指令 print 的输出格式。
- RS
RS( Record Separator):awk从文件上读取数据时,将根据 RS 的定义把数据切割成许多记录,而awk一次仅读入一条记录进行处理。
RS 的缺省值是 "\n",所以一般 awk一次仅读入一行数据。有时一个Record含括了几行数据(Multi-line Record),这情況下不能再以"\n"
来分隔相邻的记录,可改用 空白行 来分隔。
在awk程序中,令 RS = "" 表示以 空白行 来分隔相邻的记录。
- RSTART
与使用字串函数 match( )有关的变量,详见下面说明。
- RLENGTH
与使用字串函数match( )有关的变量。
当使用者使用 match(...) 函数后,awk会将 match(...) 执行的结果以RSTART、RLENGTH 记录。
请参考 附录 C awk的内置函数 match()。
- SUBSEP
SUBSEP(Subscript Separator) 数组下标的分隔字符,缺省值为"\034"。
实际上,awk中的 数组 只接受 字串 当它的下标,如: Arr["John"]。但使用者在 awk 中仍可使用 数字 当阵列的下标,甚至可使用多维的数组(Multi-dimenisional Array) 如:Arr[2,79]。事实上,awk在接受 Arr[2,79] 之前,就已先把其下标转换成字串"2\03479",之后便以Arr["2\03479"] 代替 Arr[2,79]。
可参考下例:
awk 'BEGIN {
Arr[,] =
print Arr[,]
print Arr[ , ]
print Arr["2\03479"]
idx = SUBSEP
print Arr[idx]
}
' $*
执行结果:

【译】 AWK教程指南 附录D-AWK的内置变量的更多相关文章
- 【译】 AWK教程指南 附录A-Patterns
awk 通过判断 Pattern 的值来决定是否执行其后所对应的Actions.这里列出几种常见的Pattern: A.1 BEGIN BEGIN 为 awk 的保留字,是一种特殊的 Pattern. ...
- 【译】 AWK教程指南 附录B-Actions
Actions 是由下列指令(statement)所组成: 表达式 ( 函数调用,赋值...) print 表达式列表 printf( 格式化字符串, 表达式列表) if( 表达式 ) 语句 [els ...
- 【译】 AWK教程指南 附录E-正则表达式
为什么要使用正则表达式 UNIX 中提供了许多 指令 和 tools,它们具有在文件中 查找(Search)字串或替换(Replace)字串 的功能.像 grep, vi , sed, awk,... ...
- 【译】 AWK教程指南 附录C-AWK的内建函数
C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...
- 【译】 AWK教程指南 6在AWK程序中使用Shell命令
awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...
- 【译】 AWK教程指南
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 3计算并打印文件中指定的字段数据
awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...
- 【译】 AWK教程指南 2概述
2.1 为什么用AWK 由于awk具有上述特色,在问题处理的过程中,可轻易使用awk来撰写一些小工具:这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色,可通过Shell所提供的p ...
- 【译】 AWK教程指南 11递归程序
awk 中除了函数的参数列表(Argument List)上的参数(Arguments)外,所有变量不管于何处出现,全被视为全局变量.其生命持续至程序结束——该变量不论在function外或 func ...
随机推荐
- 1014: [JSOI2008]火星人prefix - BZOJ
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- CSS3新的字体尺寸单位rem
CSS3引入新的字体尺寸单位 rem ,可以简单记忆为root rm. CSS3的出现,他同时引进了一些新的单位,包括我们今天所说的rem.在W3C官网上 是这样描述rem的——“font size ...
- uva 125
floyd 算法 如果存在无数条路 则存在a->a的路 a->b的路径数等于 a->i 和 i->b(0=<i<=_max) 路径数的乘积和 #includ ...
- Android进程守护
http://blog.csdn.net/t12x3456/article/details/8982198 http://blog.csdn.net/ljx19900116/article/detai ...
- POJ1151+线段树+扫描线
/* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- jquery的ajax和原始的ajax这两种方式的使用方法
jquery的ajax是对原始的ajax进行的封装,方便用户的使用.下面用代码分别举例各自的使用方式. jquery的ajax发送和接收xml数据格式. $.ajax({ type: "PU ...
- RxJava学习(三)
变换 所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列. 1) API 首先看一个 map() 的例子: Observable.just("images/l ...
- Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法
Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看 ...
- 部分常见ORACLE面试题以及SQL注意事项
部分常见ORACLE面试题以及SQL注意事项 一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY ...
- 【Deep Learning学习笔记】Efficient Estimation of Word Representations in Vector Space_google2013
标题:Efficient Estimation of Word Representations in Vector Space 作者:Tomas Mikolov 发表于:ICLR 2013 主要内容: ...