你好,游客 登录 注册 搜索
背景:
阅读新闻

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

[日期:2017-01-09] 来源:Linux社区  作者:cooling88 [字体: ]

  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.
  1.  print "hello',"there","jim"
  // 输出为 hello there jim,这里的逗号仅告诉awk:"helo" "there" "jim"是三个单独的字段,输出字段之间的分隔符仍是默认的OFS-空格.
要使用逗号来区分输出的字段,如下:
  1.  BEGIN {
  2.     FS="\n"
  3.     RS=""
  4.     OFS="," // 将输出字段分隔符设置为逗号
  5.  } 
 
 输出记录分隔符(ORS),默认为换行(\n),也可自定义。
  1. BEGIN {
  2.     FS="\n"
  3.     RS=""
  4.     OFS=","
  5.     ORS="\n\n"  // 输出间隔翻倍 
  6. }
 
 将多行记录换成一行内使用TAB分段格式
 
 a.md内容如下,一条记录占三行,记录之间用空白行区分,一个字段占一行。
  1. huanxgin
  2. XIAN
  3. 711711
  4. CC
  5. HANGZHOU
  6. 399229
  7. MM
  8. Shanghai
  9. 888912
要求:将一条记录整理为一行,个字段之间用tab分隔,以便导入excel处理:
  1. [root@web1 awk]# awk 'BEGIN{FS="\n";RS="";OFS="\t"} {print $1,$2,$3}' a.md
  2. huanxgin XIAN 711711 // 输出分隔符指定为制表符
  3. CC HANGZHOU 399229
  4. MM Shanghai888912
  5. [root@web1 awk]# awk 'BEGIN{FS="\n";RS="";ORS=""} { x=1; while(x<NF) { print $x "\t" ;x++} print $NF "\n"}' a.md //每个字段来一个制表符,三个字段后来一个换行。
  6. huanxgin XIAN 711711
  7. CC HANGZHOU 399229
  8. MM Shanghai888912
 
总结: 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.
  1.  print "hello',"there","jim"
  // 输出为 hello there jim,这里的逗号仅告诉awk:"helo" "there" "jim"是三个单独的字段,输出字段之间的分隔符仍是默认的OFS-空格.
要使用逗号来区分输出的字段,如下:
  1.  BEGIN {
  2.     FS="\n"
  3.     RS=""
  4.     OFS="," // 将输出字段分隔符设置为逗号
  5.  } 
 
 输出记录分隔符(ORS),默认为换行(\n),也可自定义。
  1. BEGIN {
  2.     FS="\n"
  3.     RS=""
  4.     OFS=","
  5.     ORS="\n\n"  // 输出间隔翻倍 
  6. }
 
 将多行记录换成一行内使用TAB分段格式
 
 a.md内容如下,一条记录占三行,记录之间用空白行区分,一个字段占一行。
  1. huanxgin
  2. XIAN
  3. 711711
  4. CC
  5. HANGZHOU
  6. 399229
  7. MM
  8. Shanghai
  9. 888912
要求:将一条记录整理为一行,个字段之间用tab分隔,以便导入excel处理:
  1. [root@web1 awk]# awk 'BEGIN{FS="\n";RS="";OFS="\t"} {print $1,$2,$3}' a.md
  2. huanxgin XIAN 711711 // 输出分隔符指定为制表符
  3. CC HANGZHOU 399229
  4. MM Shanghai888912
  5. [root@web1 awk]# awk 'BEGIN{FS="\n";RS="";ORS=""} { x=1; while(x<NF) { print $x "\t" ;x++} print $NF "\n"}' a.md //每个字段来一个制表符,三个字段后来一个换行。
  6. huanxgin XIAN 711711
  7. CC HANGZHOU 399229
  8. MM Shanghai888912
 
总结: awk 命令与shell相同,一条命令占一行的情况下不需要分号来进行区分,多条命令在同一行时,需要分号来区分。
while 、if、for语句也保持一致. 
NF、NR 常用来计算待处理文件的行数,引用最后一个字段($NF)。

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

Linux系统之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK简介及使用实例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文本处理工具之awk  http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文本分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

AWK入门基础教程  http://www.linuxidc.com/Linux/2016-12/138138.htm

使用awk格式化输出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-01/139371.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款