【译】 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 ...
随机推荐
- Delphi XE5 android openurl(转)
直接上代码: unit OpenViewUrl; interface // URLEncode is performed on the URL// so you need to format it p ...
- 1588: [HNOI2002]营业额统计 - BZOJ
Description营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...
- PAT-乙级-1044. 火星数字(20)
1044. 火星数字(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 火星人是以13进制计数的: 地球人的 ...
- nagios plugins之 check_http
nagios下的check_http ZT具体参数是一个比较重要的点,我带大家来看看.. //显示版本 #./check_http -V check_http v2053 (nagios-plugin ...
- 玩转redis
http://www.cnblogs.com/huangxincheng/p/5002794.html
- Posix IPC
- 让阿里云的Centos,PHP组件 ImageMagick支持png和jpeg格式
我们在Centos安装ImageMagick教程中讲述了如何安装ImageMagick,安装完毕之后发现程序并不支持png和jpeg格式的图片,但是这两种图片又是我们平时所常见的,所以我们还要进一步地 ...
- c/c++中一些高级函数的使用
setvbuf 函数名: setvbuf 功 能: 把缓冲区与流相关 用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size ...
- mybatis整合redis
mybatis默认缓存是PerpetualCache,可以查看一下它的源码,发现其是Cache接口的实现:那么我们的缓存只要实现该接口即可. 编写Redis需要用的2个工具类 RedisUtil. ...
- 封装SqlHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...