Linux 版 (精华区)
发信人: superman (风雨无阻), 信区: Unix
标 题: ◇ gawk 手册(2)
发信站: 紫 丁 香 (Mon Jun 29 07:33:29 1998), 站内信件
【 以下文字转载自 cnlinux 讨论区 】
【 原文由 Gamble_Tan@bbs.ustc.edu.cn 所发表 】
3.1 如何将输入分解成记录(records)
gawk 语言会把输入分解成记录(record)。记录与记录之间是以
record separator 隔开,record separator 的内定值是表示新一行的
字元(newline character),因此内定的 record separator 使得文字
的每一行是一个记录。
record separator 随著内建变数 RS 的改变而改变。RS 是一个字串,
它的内定值是"\n"。仅有 RS 的第一个字元是有效的,它被当作 record
separator,而 RS 的其它字元会被忽略。
内建变数 FNR 会储存目前的输入档案已经被读取的记录之个数。内
建变数 NR 会储存目前为止所有的输入档案已经被读取的记录之个数。
3.2 栏位(field)
gawk 会自动将每个记录分解成多个栏位 (field)。类似於字在一
行里面,gawk 的内定动作会认为栏位之间是以 whitespace 分开。在
gawk 里,whitespace 的意思是一个或多个空白或 tabs。
在 gawk 程式里面,以'$1'表示第一个栏位,'$2'表示第二个栏位
,依此类推。举个例子,假设输入的一行如下所示:
This seems like a pretty nice example.
第一个栏位或 $1 是'This',第二个栏位或 $2 是 'seems',依此类推。
有个地方值得特别注意,第七个栏位或 $7 是'example.'而非'example'。
不论有多少栏位,$NF 可用来表示一个记录的最後一个栏位。以
上面的例子为例,$NF 与 $7 相同,也就是'example.'。
NF 是一个内建变数,它的值表示目前这个记录之栏位的个数。
$0,看起来好像是第零个栏位,它是一个特例,它表示整个记录。
下面是一个较复杂的例子:
gawk '$1~/foo/ {print $0}' BBS-list
结果如下:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C
这个例子是把输入档'BBS-list'的每个记录的第一个栏位作检查,如
果它含有子字串'foo',则这一个记录会被印出。
3.3 如何将记录分解成栏位
gawk 根据 field separator 将一个记录分解成栏位。field sepa-
rator 以内建变数 FS 表示。
举个例子,假如 field separator 是'oo',则下面的行:
moo goo gai pan
会被分成三个栏位:'m'、' g'、' gai pan'。
在 gawk 程式里,可以使用'='来改变 FS 的值。例如:
gawk 'BEGIN {FS=","}; {print $2}'
输入行如下:
John Q. Smith, 29 Oak St., Walamazoo, MI 42139
执行gawk的结果将印出字串 ' 29 Oak St.'。BEGIN 後面的 action 会在
第一个记录被读取之前执行一次。
第四章 印出
在gawk程式里,actions 最常做的事就是印出(printing)。简单
的印出,使用 printe叙述。复杂格式的印出,使用 printf 叙述。
4.1 print叙述
print 叙述用在简单、标准的输出格式。叙述的格式如下所示:
print item1, item2, ...
输出时,各个 item 之间会以一个空白分开,最後会换行(newline)。
如果 'print'叙述之後没有跟著任何东西,它与'print $0'的效
果一样,它会印出现在的记录(record)。要印出空白行可使用'print
""'。 印出一段固定的文字,可用双引号将文字的两边括起来,例如
'print "Hello there"'。
这里是一个例子,它会把每个输入记录的前二个栏位印出:
gawk '{print $1,$2}' shipped
结果如下所示:
Jan 13
Feb 15
Mar 15
Apr 31
May 16
Jun 31
Jul 24
Aug 15
Sep 13
Oct 29
Nov 20
Dec 17
Jan 21
Feb 26
Mar 24
Apr 21
4.2 Output Separators
前面我们已提过如果 print 叙述包含有多个 item,item 之间
用逗点分开,则印出时各个item会被一个空白隔开。你能够使用任何
的字串作为 output field separator,可以经由内建变数 OFS 的设
定来更改 output field separator。OFS 的初始值为" ",即一格的
空白。
整个 print 叙述的输出被称为 output record。print 叙述输
出 output record 之後,会接著输出一个字串,此字串称为 output
record separator。内建变数 ORS 用来指明此字串。ORS 的初始值
为 "\n",也就是换行。
下面这个例子会印出每个记录的第一个栏位和第二个栏位,此二
个栏位之间以分号';'分开,每行输出之後会加入一个空白行。
gawk 'BEGIN {OFS=";"; ORS="\n\n"} {print $1, $2}' BBS-list
结果如下所示:
aardvark;555-5553
alpo-net;555-3412
barfly;555-7685
bites;555-1675
camelot;555-0542
core;555-2912
fooey;555-1234
foot;555-6699
macfoo;555-6480
sdace;555-3430
sabafoo;555-2127
4.3 printf叙述
printf 叙述会使得输出格式较容易精确地控制。printf 叙述可以
指定每个 item 印出的宽度,也可以指定数字的各种型式。
printf 叙述的格式如下:
printf format, item1, item2, ...
print 与 printf 的差别是在於 format, printf 的引数比 print
多了字串 format。format 的型式与 ANSI C 的 printf 之格式相同。
printf 并不会做自动换行的动作。内建变数 OFS 与 ORS 对 printf 叙
述没有任何影响。
格式的指定以字元'%'开始,後面接著格式控制字母。
格式控制字母如下所示:
'c' 将数字以 ASCII 字元印出。
例如'printf "%C",65'会印出字元'A'。
'd' 印出十进位的整数。
'i' 印出十进位的整数。
'e' 将数字以科学符号的形式印出。
例如
print "$4.3e",1950
结果会印出'1.950e+03'。
'f' 将数字以浮点的形式印出。
'g' 将数字以科学符号的形式或浮点的形式印出。数字的绝对值如果
大於等於0.0001则以浮点的形式印出,否则以科学符号的形式印
出。
'o' 印出无号的八进位整数。
's' 印出一个字串。
'x' 印出无号的十六进位整数。10至15以'a'至'f'表示。
'X' 印出无号的十六进位整数。10至15以'A'至'F"表示。
'%' 它并不是真正的格式控制字母,'%%"将印出"%'。
在 % 与格式控制字母之间可加入 modifier,modifier 是用来进一
步控制输出的格式。可能的 modifier 如下所示:
'-' 使用在 width 之前,指明是向左靠齐。如果'-'没有出现,则会在
被指定的宽度向右靠齐。例如:
printf "%-4S", "foo"
会印出'foo '。
'width' 这一个数字指示相对应的栏位印出时的宽度。例如:
printf "%4s","foo"
会印出' foo'。
width 的值是一个最小宽度而非最大宽度。如果一个 item 的
值需要的宽度比 width 大,则不受 width 的影响。例如
printf "%4s","foobar"
将印出'foobar'。
'.prec' 此数字指定印出时的精确度。它指定小数点右边的位数。如
果是要印出一个字串,它指定此字串最多会被印出多少个字
元。
--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]
--
※ 修改:.superman 于 Jun 30 08:26:31 修改本文.[FROM: 202.118.224.169]
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: poster.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.616毫秒