LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1907|回复: 26

awk脚本中大括号的作用是什么?[已解决]

[复制链接]
发表于 2004-4-15 17:15:04 | 显示全部楼层 |阅读模式
在awk脚本中,以独立的一句作为一行,有的时候没有大括号“{ }”就出错,有的句子可以不要大括号,但是有和没有的结果却试不一样的,那大括号到底起一个什么作用呢,在哪种情况下使用呢?

太迷惑了,真诚请教,万分感谢。
发表于 2004-4-15 17:21:44 | 显示全部楼层
awk语句,基本是由模式操作构成.
模式就是我们常用的用斜线封装起来的表达式,而操作,是封装在大括号
里并且用分号分隔的语句!如:
awk '/模式/{操作1;操作2;...操作n;}' 文件
awk默认的操作是print $0,所以
awk '/abc/{print $0}' file等同awk '/abc/' file
当需要用多个条件语句判断时候,就需要大括号,而单个的,也可以忽略,如
awk '$1~/abc/' file #不需要
awk -F. '{if($1~/abc/)print $2;else print $0}' file #需要
发表于 2004-4-15 17:24:01 | 显示全部楼层

回复: awk脚本种大括号的作用是什么?

最初由 litty 发表
在awk脚本中,以独立的一句作为一行,有的时候没有大括号“{ }”就出错,有的句子可以不要大括号,但是有和没有的结果却试不一样的,那大括号到底起一个什么作用呢,在哪种情况下使用呢?

太迷惑了,真诚请教,万分感谢。

awk脚本有三部分组成。(如果是命令行,那么这里讨论的就是' '括起来的部分)
第一部分是awk扫描文件前的"过程"
BEGIN{procedure}
第二部分(读取文件)主体格式如下

  1. /pattern1/ {procedure1}
  2. ...
  3. /patternN/ {procedureN}
复制代码

模式pattern限定"过程"procedure作用的行。每从文件抽取一行,所有的pattern将依次检测是否与之匹配。若省略模式,则匹配所有行。
第三部分是awk扫描文件完毕后的"过程"
END{procedure}

至于实例,请参阅置顶的"源码鉴赏"一帖。
 楼主| 发表于 2004-4-15 17:25:58 | 显示全部楼层
最初由 javalee 发表
awk语句,基本是由模式操作构成.
模式就是我们常用的用斜线封装起来的表达式,而操作,是封装在大括号
里并且用分号分隔的语句!如:
awk '/模式/{操作1;操作2;...操作n;}' 文件
awk默认的操作是print $0,所以
awk '/abc/{print $0}' file等同awk '/abc/' file


如果在脚本中有若干语句,那awk会默认都打印吗?
怎么样使其不打印呢?
发表于 2004-4-15 17:28:10 | 显示全部楼层
最初由 litty 发表
如果在脚本中有若干语句,那awk会默认都打印吗?
怎么样使其不打印呢?

默认不打印。要显式使用print来打印。
发表于 2004-4-15 17:32:31 | 显示全部楼层

回复: 回复: awk脚本种大括号的作用是什么?

最初由 home_king 发表
awk脚本有三部分组成。(如果是命令行,那么这里讨论的就是' '括起来的部分)
第一部分是awk扫描文件前的"过程"
BEGIN{procedure}
第二部分(读取文件)主体格式如下

  1. /pattern1/ {procedure1}
  2. ...
  3. /patternN/ {procedureN}
复制代码

模式pattern限定"过程"procedure作用的行。每从文件抽取一行,所有的pattern将依次检测是否与之匹配。若省略模式,则匹配所有行。
第三部分是awk扫描文件完毕后的"过程"
END{procedure}

至于实例,请参阅置顶的"源码鉴赏"一帖。

呵呵,还是教主讲的专业~~ :thank
ps:换头像了
发表于 2004-4-15 17:39:23 | 显示全部楼层
ps:本教主的新头像好看嘛?呵呵~~~
 楼主| 发表于 2004-4-15 17:41:53 | 显示全部楼层
[litty@litty tmp]$ cat tt
Mike Harrington510)548-1278:250:100:175
Christian Dalsass408)538-2358:155:90:201
Susan Dalsass206)654-6279:250:60:50

[litty@litty tmp]$ cat awk.tt
BEGIN{FS=":";OFMT="%.2f";}

{$6=$3+$4+$5;}
{printf "%-20s%12s%8.2f%8.2f%8.2f%15.2f\n",$1,$2,$3,$4,$5,$6}

[litty@litty tmp]$ cat awk.tt.1
BEGIN{FS=":";OFMT="%.2f";}

$6=$3+$4+$5;
{printf "%-20s%12s%8.2f%8.2f%8.2f%15.2f\n",$1,$2,$3,$4,$5,$6}

[litty@litty tmp]$ awk -f awk.tt tt
Mike Harrington     (510)548-1278  250.00  100.00  175.00         525.00
Christian Dalsass   (408)538-2358  155.00   90.00  201.00         446.00
Susan Dalsass       (206)654-6279  250.00   60.00   50.00         360.00

[litty@litty tmp]$ awk -f awk.tt.1 tt
Mike Harrington (510)548-1278 250 100 175 525
Mike Harrington     (510)548-1278  250.00  100.00  175.00         525.00
Christian Dalsass (408)538-2358 155 90 201 446
Christian Dalsass   (408)538-2358  155.00   90.00  201.00         446.00
Susan Dalsass (206)654-6279 250 60 50 360
Susan Dalsass       (206)654-6279  250.00   60.00   50.00         360.00


这又是怎么回事呢? {$6=$3+$4+$5;} $6=$3+$4+$5; 只差一个大括号,结果就完全不一样。
发表于 2004-4-15 17:51:48 | 显示全部楼层
"$6=$3+$4+$5;"没有放在大括号里,awk将其视为模式。由于模式匹配所有行,但没有过程,所以按默认过程处理,打印$1~$n。
”{printf "%-20s%12s%8.2f%8.2f%8.2f%15.2f\n",$1,$2,$3,$4,$5,$6}“没有模式,匹配所有行,再把$0打印一次,但使用了格式化。
 楼主| 发表于 2004-4-15 17:57:16 | 显示全部楼层
最初由 home_king 发表
"$6=$3+$4+$5;"没有放在大括号里,awk将其视为模式。由于模式匹配所有行,但没有过程,所以按默认过程处理,打印$0。
”{printf "%-20s%12s%8.2f%8.2f%8.2f%15.2f\n",$1,$2,$3,$4,$5,$6}“没有模式,匹配所有行,再把$0打印一次,但使用了格式化。




哦,是这么回事。我迷惑了好久。
那么是不是所有的awk语句中都必须有模式和动作这两部分呢,如果动作缺失就默认为打印$0,那如果模式缺失有默认的模式吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表