原文:http://doc.lazyhack.net/awk.htm
awk 的�冉ū淞� Built-in Variables
l ARGC
ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程式"直接写於命令列上, 则 ARGC 亦不将该"程式部分"列入计算.
l ARGV
ARGV数组用以记录命令列上的参数.
例 : 执行下列命令
$ awk -F\t -v a=8 -f prg.awk file1.dat file2.dat
或
$ awk -F\t -v a=8 '{ 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.
l FILENAME
FILENAME用以表示目前正在处理的文件档名.
l FS
栏位分隔字符.
l $0
表示目前awk所读入的数据行.
l $1,$2..
分�e表示所读入的数据行之第一栏, 第二栏,..
说明:
当awk读入一笔数据行 "A123 8:15" 时,会先以$0 记录.
故 $0 = "A123 8:15"
若程序中进一步使用了 $1, $2.. 或 NF 等�冉ū淞渴�, awk才会自动分割 $0.
以便取得栏位相关的资料. 切割后各个栏位的资料会分�e以$1, $2, $3...予以记录.
awk�榷�(default)的 栏位分隔字符(FS) 为 空白字符(空格及tab).
以本例而言, 读者若未改变 FS, 则分割后:
第一栏($1)="A123", 第二栏($2)="8:15".
使用者可用正则表达式自行定义 FS. awk每次需要分割数据行时, 会参考目前FS的值.
例如 :
令 FS = "[ :]+" 表示任何由 空白" " 或 冒号":" 所组成的字串都可当成分隔字符, 则分割后 :
第一栏($1) = "A123", 第二栏($2) = "8", 第三栏($3) = "15"
l NR
NR 表从 awk 开始执行该程序后所读取的数据行数.
l FNR
FNR 与 NR 功用类似. 不同的是awk每打开一个新的文件,FNR 便从 0 重新累计
l NF
NF表目前的数据行所被切分的栏位数.
awk 每读入一笔资料后, 在程序中可以 NF 来得知该行数据包含的栏位个数.在下一笔资料被读入之前, NF 并不会改变. 但使用者若自行使用$0来记录数据,例如: 使用 getline , 此时 NF 将代表新的 $0 上所记载的资料的栏位个数.
l OFS
OFS输出时的栏位分隔字符. 预设值 " "(一个空白), 详见下面说明.
l ORS
ORS输出时数据行的分隔字符. 预设值 "\n"(跳行), 见下面说明.
l OFMT
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 }'
输出:
0.666667 1
0.67:1
程序中通过改变OFS和OFMT的值, 改变了指令 print 的输出格式.
l RS
RS( Record Separator) : awk从文件上读取资料时, 将根据 RS 的定义把资料切割成许多Records,而awk一次仅读入一个Record,以进行处理.
RS 的预设值是 "\n". 所以一般 awk一次仅读入一行资料.
有时一个Record含括了几行资料(Multi-line Record). 这情�r下不能再以"\n"
来分隔相邻的Records, 可改用 空白行 来分隔.
在awk程式中,令 RS = "" 表示以 空白行 来分隔相邻的Records.
ARGIND
当前正在处理的ARGV中的文件的索引值(同时处理多个文件时会用到)
IGNORECASE
如果该变量设置为非0值,在进行字符串匹配时忽略大小写。