awk学习笔记九-内建变量

 原文: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

程序中通过改变OFSOFMT的值改变了指令 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值,在进行字符串匹配时忽略大小写。

 

你可能感兴趣的:(awk,休闲,variables,built-in,内建变量,awk笔记)