awk 笔记之三 - 输入的处理 FS RS

1. awk 脚本从标准输入端(键盘输入或管道) 或者命令行指定的文件中读取. 可以指定多个文件.当前文件名在内建变量FILENAME中. 每次读取和处理一个记录(record). 每个记录分成若干个字段.  缺省情况下,  每个记录就是一行文件. RS变量指定划分记录的字符. 缺省RS为换行符-'\n'.   可以指定其他字符用于划分记录. gawk 甚至允许指定一个字符串, 或者正则表达来作为RS.    

a) RS 可以在脚本程序中修改, 比如BEGIN,  示例如: awk ' BEGIN {RS="/"} BBS-list

        b) 在awk的命令行中指定 如 awk ' {print $0}' RS="/" BBS-list

        c) RS="" 表示用一个或者多个空行可以分割符

2.  每个记录被awk分割成若干个字段, 分隔符用FS表示, 缺省FS为空白, 包括一个或者多个空格, tab, 换行符

      a) FS 跟 RS一样可以被awk脚本赋予新的值

     b) NF表示当前记录的字段个数, $0表示整个记录, $1~$NF分别表示第1到NF字段

3   获取某个字段N的值可以使用$N, 其中N并不要求是常数, 可以是变量或者表达式, awk来负责转换. 但是要注意 N 不能为负数.  像$NF, $(2*2)等都是可以的.

4  awk允许修改记录的内容, 但改变只局限于awk脚本内部, 输入文件并不会被修改.

     a) 可以修改$N的值, OFS表示当前记录的分隔符.  对某个字段的修改, $0也会作出相应的修改.

     b) 对某个字符重新赋值, 可以重建$0, 如 

          echo a b c d | awk { OFS=":"; $1=$1;print $0 }'

          a:b:c:d 

        如果不给$1重新赋值, $0的输出并不会因为OFS的修改可重建, 故输出还是 a b c d

    c) echo a b c d | awk ' { OFS=":";$5=$1$2$3$4;print $0 }'

         输出: a:b:c:d:abcd

5   指定FS的方式:

      a)   awk 的 -F 选项     awk F, '{print $1}' inputfile     指定逗号为分隔符

      b)  在脚本中给FS 赋值 如 awk '  BEGIN { FS="," };{print $1}' inputfile

      c) 在命令行中给FS赋值, 如 awk ' {print $1}' FS="," inputfile

6.  多行记录

      有些记录太长, 一行写不下, 可以使用多行. 这个时候, 缺省的分隔符不能使用了. 可以考虑使用特殊字符,比如"\f", 或者使用RS="". 多个空行作为分隔符.

      而FS则为"\n"

你可能感兴趣的:(awk 笔记之三 - 输入的处理 FS RS)