awk命令详细说明(1)

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

3.2 条件语句


awk的if语句类似于C语言的if语句,没什么好说的,举一个例子吧:

{

if ( $1 == “foo” ) {

if ( $2 == “foo” ) {

print “uno”

} else {

print “one”

}

} else if ($1 == “bar” ) {

print “two”

} else {

print “three”

}

}

3.3 循环语句


其实在第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

}

  • breakcontinue

此外,如同C语言一样,awk提供了break、continue来控制awk的循环结构。break语句用于跳出最深层的循环,使循环立即终止,并继续执行循环代码块后面的语句。continue语句使awk立即开始执行下一个循环迭代,而不执行代码块的其余部分。

3.4 数组


在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.”

}

4 第三部分:精通

========================================================================

4.1 格式化输出


虽然大多数情况下awk的print语句可以完成任务,但有时我们还需要更多。使用两个函数

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值