LinuxSir.cn,穿越时空的Linuxsir!

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

awk的问题

[复制链接]
发表于 2005-2-2 17:30:55 | 显示全部楼层 |阅读模式
文件test内容如下:
1,
A.
2,
B.
3,
C.
每行的标点后面紧接着一个回车。


awk ‘/^1/ { print " Hit a record " }'  RS=. test

Hit a record

awk ‘/^2/ { print " Hit a record " }'  RS=. test

什么也没显示

这是怎么回事? :ask
发表于 2005-2-2 18:23:13 | 显示全部楼层
为什么你要在awk命令后面加上RS=.呢?
要改变FS或者RS,最好的办法是在BEGIN段对其赋值。

  1. #比如将域分隔符FS设置成换行符,将记录分隔符设置成空格
  2. BEGIN{
  3. FS="\n"
  4. RS=" "
  5. }
复制代码

而且,你想完成什么任务呢?为什么要设置RS呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-2 20:57:45 | 显示全部楼层
为什么你要在awk命令后面加上RS=.呢?
要改变FS或者RS,最好的办法是在BEGIN段对其赋值。

我只是想试试。
RS=. 是利用命令行参数设定系统变量,不可以吗?
即便是在BEGIN段设置RS=“.", 还是存在上述问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-2 23:59:51 | 显示全部楼层
原来将 '/^2/' 改为 '/^\n2/' 即可。因为“."为记录分隔符,所以第二条记录实际上是"\n2,\nB”。而第一条记录前面没有"\n",所以要用‘/^1/'。awk的主输入循环大概是对每一条记录进行读取并操作。默认的记录分隔符为
“\n",所以平时老以为awk是对每个输入行进行操作。
但是 awk ‘/^\n2/ { print $1, $2 }'  RS=.  test , 并没有出现我料想的:

此处为一回车
2紧跟一个空格和回车
此处为一回车
B

而是:

2,紧跟一个空格B

原因在于:”," 不是默认的FS,当 RS="." 时, 默认的FS是“\n","\n"之间的内容为一个字段(除了第一个记录)。
至于平时常见的默认FS由空格变为换行符,就不知道为什么了。待高人明示。
回复 支持 反对

使用道具 举报

发表于 2005-2-11 20:45:42 | 显示全部楼层
Post by i-linux
原来将 '/^2/' 改为 '/^\n2/' 即可。因为“."为记录分隔符,所以第二条记录实际上是"\n2,\nB”。而第一条记录前面没有"\n",所以要用‘/^1/'。awk的主输入循环大概是对每一条记录进行读取并操作。默认的记录分隔符为
“\n",所以平时老以为awk是对每个输入行进行操作。
但是 awk ‘/^\n2/ { print $1, $2 }'  RS=.  test , 并没有出现我料想的:

此处为一回车
2紧跟一个空格和回车
此处为一回车
B

而是:

2,紧跟一个空格B

原因在于:”," 不是默认的FS,当 RS="." 时, 默认的FS是“\n","\n"之间的内容为一个字段(除了第一个记录)。
至于平时常见的默认FS由空格变为换行符,就不知道为什么了。待高人明示。


awk以一行为一个record,pattern加上^限定了首字,可以这样。
BEGIN {
        FS=","
        RS=".\n"
}

/^[1-3]/ {print $1" "$2}
或把test改为一行一个record.
回复 支持 反对

使用道具 举报

发表于 2005-2-15 12:11:15 | 显示全部楼层
问题出在  /^2/   的 ^ 上
这个表示匹配 以  2 为开始的字符串
你认为添加 RS=. 之后存在2的那个字符是以 \n为开头,自然匹配不了
把^去掉就可以了
回复 支持 反对

使用道具 举报

发表于 2005-2-15 12:12:40 | 显示全部楼层
修正:

问题出在 /^2/ 的 ^ 上
这个表示匹配 以 2 为开始的字符串
添加 RS=. 之后存在2的那个字符串是以 \n为开头,自然匹配不了
把^去掉就可以了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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