友情提示:本站最近进行了改版升级,如出现显示异常,请刷新页面或清除一下缓存!

  在《awk文件处理方式——记录和字段》中介绍了awk对于数据的处理方式,awk默认按照换行符分割输入,每读取一条输入信息后以$0来表示,若程序中进一步使用$1、$2…$NF等内建变量的时候,awk会按照默认的字段分隔符来切割$0,并将字段值分别保存在$1、$2等变量中。

  awk中默认的字段分隔符为空白(空格或者tab),awk提供两种方式修改默认的字段分隔符,一种是命令行中的-F选项(示例请参考《awk命令语法详解》),另一种就是通过修改awk内建的字段分隔符变量:FS

  awk的字段分隔符可以为单个字符也可以为正则表达式!请看下面的示例:

CodingAnts@ubuntu:~/awk$ date > dt | cate dt
Fri Mar 23 23:18:14 PDT 2012
CodingAnts@ubuntu:~/awk$ cat dt | awk '{for(i=1; i<=NF; i++) print $i}'
Fri
Mar
23
23:18:14
PDT
2012
CodingAnts@ubuntu:~/awk$ cat dt | awk 'BEGIN {FS=":"} {for(i=1; i<=NF; i++) print $i}'
Fri Mar 23 23
18
14 PDT 2012
CodingAnts@ubuntu:~/awk$ cat dt | awk 'BEGIN {FS="[: ]"} {for(i=1; i<=NF; i++) print $i}' 
Fri
Mar
23
23
18
14
PDT
2012

  首先通过date命令获取日期信息,并重定向输出到dt文件中,再通过cat 命令显示出来,这样做的目的主要是保证下面命令中的日期信息是一致,如果你要保持和本示例一样的效果,那就新建个dt文件,然后手动输入上面的日期时间信息即可。

  示例中红色显示的awk指令采用awk默认的字段分隔符对date的输出信息进行分割,awk默认按照空白来进行分割,这里共将date的输出信息分为6段,可以分别用$1-$6来获取。

  蓝色显示的awk指令,修改了awk的内建的字段分隔符变量FS,这里采用单个字符(冒号)的分割方式对记录进行分割,共分割出3个字段,分别以$1、$2、$3来表示。

  紫色显示的awk指令,也修改了awk的内建的字段分隔符变量FS,这里采用的是正则表达式的分割方式,冒号和空格都可以作为分割方式,因此date的输出信息被分割为8个字段。

awk如何处理连续出现的分隔符

CodingAnts@ubuntu:~/awk$ echo "a  b :4::3" | awk 'BEGIN{FS="[ :]"} {for(i=1; i<=NF; i++) print "$"i"="$i}'
$1=a
$2=
$3=b
$4=
$5=4
$6=
$7=3
CodingAnts@ubuntu:~/awk$ echo "a  b :4::3" | awk 'BEGIN{FS="[ :]+"} {for(i=1; i<=NF; i++) print "$"i"="$i}'
$1=a
$2=b
$3=4
$4=3

  对于连续出现的分隔符,awk完全按照FS的设定进行,上面示例中均设置FS为一个正则表达式,不同之处是一个+的区别,这里的+是扩展正则表达式中的一个元字符,表示前面中括号中的字符可以出现1次或者多次,因此下面的awk指令可以正确的将输入分割为四个字段,而前一个awk指令则分割出了7个字段,其中有三个字段为空,这个主要是FS使用的正则表达式不同所导致。

转载请注明:Coding Ants » awk内建变量示例详解之字段分隔符FS

相关文章

1访客评论

  1. :mrgreen: good

    匿名10-25 09:35 回复

我来说说

(便于我们更好的交流)

没有交流就没有进步,在此输入您对本文的看法!
取消