lisi
13012345678
ls@21cn.com
要处理这个文件,可以将每三行看作是一个独立的记录,一个记录包含三个字段。如下脚本将原记录由三行转换成一行输出:
BEGIN {
FS=“\n”
RS=“”
}
{
print $1 ", " $2 ", " $3
}
此代码将产生以下输出:
zhangsan, 13712345678, zhs@hotmail.com
lisi, 13012345678, ls@21cn.com
在上面例子中,为了在三个字段之间插入一个逗号和空格,使用了",“。这个方法虽然有用,但比较难看。其实我们还有更好的方法,那就是设置变量OFS(输出字段分隔符)。OFS缺省情况下被设置成” "(单个空格)。使用如下脚本可以达到上面例子同样的效果:
BEGIN {
FS=“\n”
RS=“”
OFS=", "
}
{
print $1, $2, $3
}
awk还有一个特殊变量ORS(输出记录分隔符)。ORS缺省情况下被设置成\n
,如果我们将其设为\n\n
,就可以使输出记录的间隔翻倍。例子就不举了,大家可以自己试试。个空格分隔记录(而不换行),将ORS设置成 (空格)。
需要注意的是,使用上面的方法,最多只能处理一个记录占用三行的文本,象下面一个记录占据四行的通讯录,就处理不了了(大家可以试试看):
wangwu
13512345678
ww@163.com
wuhan, hubei
要处理这种情况,代码最好考虑每个记录的字段数量,并依次打印每个记录。以下就是修正的代码:
BEGIN {
FS=“\n”
RS=“”
ORS=“”
}
{
x=1
while ( x<NF ) {
print $x “\t”
x++
}
print $NF “\n”
}
程序输出如下:
wangwu 13512345678 ww@163.com wuhan, hubei
awk的if语句类似于C语言的if语句,没什么好说的,举一个例子吧:
{
if ( $1 == “foo” ) {
if ( $2 == “foo” ) {
print “uno”
} else {
print “one”
}
} else if ($1 == “bar” ) {
print “two”
} else {
print “three”
}
}
其实在第1节的最后(处理多行),我们已经看到了awk的while循环结构,它等同于相应的C语言while循环。awk还有"do…while"循环,它在代码块结尾处对条件求值,还是直接举例吧:
do...while
示例
{
count=1
do {
print “I get printed at least once no matter what”
} while ( count != 1 )
}
for
循环
也等同于C语言的for循环:
for ( x = 1; x <= 4; x++ ) {
print “iteration”,x
}
break
和continue
此外,如同C语言一样,awk提供了break、continue来控制awk的循环结构。break语句用于跳出最深层的循环,使循环立即终止,并继续执行循环代码块后面的语句。continue语句使awk立即开始执行下一个循环迭代,而不执行代码块的其余部分。
在awk中,数组下标通常从1开始,而不是0:
myarray[1]=“jim”
myarray[2]=456
awk遇到第一个赋值语句时,它将创建myarray,并将元素myarray[1]设置成"jim"。执行了第二个赋值语句后,数组就有两个元素了。Awk数组不需要连续的数字序列下标(例如,可以定义myarr[1]和myarr[1000],但不定义其它所有元素)
awk可以使用in
操作来遍历数组中的所有元素,如下所示:
for ( x in myarray ) {
print myarray[x]
}
但是这个方法有一个缺点——当awk在数组下标之间轮转时,它不会依照任何特定的顺序。那就意味着我们不能知道以上代码的输出是:
jim
456
还是
456
jim
awk数组中还可以使用字符串下标,其实,不管你使用的下标是字符串还是数字,awk在幕后还将其认为是字符串下标。举例如下:
代码一:
myarr[“1”]=“China”
print myarr[“1”]
代码二:
myarr[“1”]=“Mr. Whipple”
print myarr[1]
代码三:
myarr[“name”]=“Mr. Whipple”
print myarr[“name”]
它们都将打印 “China”!
删除数组元素使用delete
,举例如下:
delete fooarray[1]
另外,如果想要查看是否存在某个特定数组元素,可以使用特殊的in
布尔运算符,如下所示:
if ( 1 in fooarray ) {
print “It’s there.”
} else {
print “Can’t find it.”
}
========================================================================
虽然大多数情况下awk的print语句可以完成任务,但有时我们还需要更多。使用两个函数