您的位置:首页 > 运维架构 > Shell

awk-语法深入-记录、字段分隔符

2016-08-22 20:01 806 查看
  awk规定,对于文本文件,默认情况下,一条记录对应一行,即记录之间的默认分隔符是换行符;而一条记录又可以分为多个字段,默认字段分隔符为空格。

   输入记录分隔符变量:RS(record sign)

   输出记录分隔符变量:ORS(output record sign)

   字段分隔符变量:FS(field sign)

   输出字段分隔符变量:OFS(output field sign)

1.一条记录占多行(多行记录)

  有些情况下:一条记录跨越多行,记录与记录之间使用非换行符。这种情况下需要修改记录分隔符变量RS,RS告诉awk当前记录什么时候结束。

  例如:

     BEGIN {

        FS="\n"  // 将字段分隔符设为换行符,一个字段占一行

        RS=""    // 将记录分隔符设为空白行,记录之间由空白行分隔

     }

2.OFS 和 ORS

 输出字段分隔符(OFS),默认为单个空格" ",可以修改OFS变量,制定输出字段之间的分隔符。

 eg.

 print "hello',"there","jim"


  // 输出为 hello there jim,这里的逗号仅告诉awk:"helo" "there" "jim"是三个单独的字段,输出字段之间的分隔符仍是默认的OFS-空格.

要使用逗号来区分输出的字段,如下:

 BEGIN {

    FS="\n"

    RS=""

    OFS=","  // 将输出字段分隔符设置为逗号

 }   


 输出记录分隔符(ORS),默认为换行(\n),也可自定义。

BEGIN {

    FS="\n"

    RS=""

    OFS=","

    ORS="\n\n"  // 输出间隔翻倍 

}


 将多行记录换成一行内使用TAB分段格式

 a.md内容如下,一条记录占三行,记录之间用空白行区分,一个字段占一行。

huanxgin
XIAN

711711


CC

HANGZHOU

399229


MM

Shanghai

888912


要求:将一条记录整理为一行,个字段之间用tab分隔,以便导入excel处理:

[root@web1 awk]# awk 'BEGIN{FS="\n";RS="";OFS="\t"} {print $1,$2,$3}' a.md

huanxgin        XIAN    711711          // 输出分隔符指定为制表符

CC      HANGZHOU        399229

MM      Shanghai        888912

[root@web1 awk]# awk 'BEGIN{FS="\n";RS="";ORS=""} { x=1; while(x<NF) { print $x "\t" ;x++} print $NF "\n"}' a.md                    //每个字段来一个制表符,三个字段后来一个换行。

huanxgin        XIAN    711711

CC      HANGZHOU        399229

MM      Shanghai        888912


总结: awk 命令与shell相同,一条命令占一行的情况下不需要分号来进行区分,多条命令在同一行时,需要分号来区分。

while 、if、for语句也保持一致. 

NF、NR 常用来计算待处理文件的行数,引用最后一个字段($NF)。

  awk规定,对于文本文件,默认情况下,一条记录对应一行,即记录之间的默认分隔符是换行符;而一条记录又可以分为多个字段,默认字段分隔符为空格。

   输入记录分隔符变量:RS(record sign)

   输出记录分隔符变量:ORS(output record sign)

   字段分隔符变量:FS(field sign)

   输出字段分隔符变量:OFS(output field sign)

1.一条记录占多行(多行记录)

  有些情况下:一条记录跨越多行,记录与记录之间使用非换行符。这种情况下需要修改记录分隔符变量RS,RS告诉awk当前记录什么时候结束。

  例如:

     BEGIN {

        FS="\n"  // 将字段分隔符设为换行符,一个字段占一行

        RS=""    // 将记录分隔符设为空白行,记录之间由空白行分隔

     }

2.OFS 和 ORS

 输出字段分隔符(OFS),默认为单个空格" ",可以修改OFS变量,制定输出字段之间的分隔符。

 eg.

 print "hello',"there","jim"


  // 输出为 hello there jim,这里的逗号仅告诉awk:"helo" "there" "jim"是三个单独的字段,输出字段之间的分隔符仍是默认的OFS-空格.

要使用逗号来区分输出的字段,如下:

 BEGIN {

    FS="\n"

    RS=""

    OFS=","  // 将输出字段分隔符设置为逗号

 }   


 输出记录分隔符(ORS),默认为换行(\n),也可自定义。

BEGIN {

    FS="\n"

    RS=""

    OFS=","

    ORS="\n\n"  // 输出间隔翻倍 

}


 将多行记录换成一行内使用TAB分段格式

 a.md内容如下,一条记录占三行,记录之间用空白行区分,一个字段占一行。

huanxgin
XIAN

711711


CC

HANGZHOU

399229


MM

Shanghai

888912


要求:将一条记录整理为一行,个字段之间用tab分隔,以便导入excel处理:

[root@web1 awk]# awk 'BEGIN{FS="\n";RS="";OFS="\t"} {print $1,$2,$3}' a.md

huanxgin        XIAN    711711          // 输出分隔符指定为制表符

CC      HANGZHOU        399229

MM      Shanghai        888912

[root@web1 awk]# awk 'BEGIN{FS="\n";RS="";ORS=""} { x=1; while(x<NF) { print $x "\t" ;x++} print $NF "\n"}' a.md                    //每个字段来一个制表符,三个字段后来一个换行。

huanxgin        XIAN    711711

CC      HANGZHOU        399229

MM      Shanghai        888912


总结: awk 命令与shell相同,一条命令占一行的情况下不需要分号来进行区分,多条命令在同一行时,需要分号来区分。

while 、if、for语句也保持一致. 

NF、NR 常用来计算待处理文件的行数,引用最后一个字段($NF)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  awk shell awk