`

awk中RS,ORS,FS,OFS区别 此文转载

阅读更多
awk中RS,ORS,FS,OFS区别与联系张映

分类目录: shell
学习awk时,一定要记得动手去实践,只有在实践中才能发现问题,以下就我在学习中和实践中的经验,总结一下RS,ORS,FS,OFS的区别和联系。

一,RS与ORS

1,RS是记录分隔符,默认的分隔符是\n,具体用法看下

查看复制打印?
[root@krlcgcms01 mytest]# cat test1     //测试文件  
111 222  
333 444  
555 666 

[root@krlcgcms01 mytest]# cat test1     //测试文件
111 222
333 444
555 6662,RS默认分割符\n

查看复制打印?
[root@krlcgcms01 mytest]# awk '{print $0}' test1  //awk 'BEGIN{RS="\n"}{print $0}' test1 这二个是一样的  
111 222  
333 444  
555 666 

[root@krlcgcms01 mytest]# awk '{print $0}' test1  //awk 'BEGIN{RS="\n"}{print $0}' test1 这二个是一样的
111 222
333 444
555 666其实你可以把上面test1文件里的内容理解为,111 222\n333 444\n555 6666,利用\n进行分割。看下一个例子

3,自定义RS分割符

查看复制打印?
[zhangy@localhost test]$ echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0,RT}' 
111 222 |  
333 444 |  
555 666 

[zhangy@localhost test]$ echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0,RT}'
111 222 |
333 444 |
555 666结合上面一个例子,就很容易理解RS的用法了。

4,RS也可能是正则表达式

查看复制打印?
[zhangy@localhost test]$ echo "111 222a333 444b555 666"|awk 'BEGIN{RS="[a-z]+"}{print $1,RS,RT}' 
111 [a-z]+ a  
333 [a-z]+ b  
555 [a-z]+ 

[zhangy@localhost test]$ echo "111 222a333 444b555 666"|awk 'BEGIN{RS="[a-z]+"}{print $1,RS,RT}'
111 [a-z]+ a
333 [a-z]+ b
555 [a-z]+从例3和例4,我们可以发现一点,当RT是利用RS匹配出来的内容。如果RS是某个固定的值时,RT就是RS的内容。

5,RS为空时

查看复制打印?
[zhangy@localhost test]$ cat -n test2  
1  111 222  
2  
3  333 444  
4  333 444  
5  
6  
7  555 666  
[zhangy@localhost test]$ awk 'BEGIN{RS=""}{print $0}' test2  
111 222  
333 444  
333 444  
555 666  
[zhangy@localhost test]$ awk 'BEGIN{RS="";}{print "<",$0,">"}' test2  //这个例子看着比较明显  
< 111 222 >  
< 333 444     //这一行和下面一行,是一行  
333 444 >  
< 555 666 > 

[zhangy@localhost test]$ cat -n test2
1  111 222
2
3  333 444
4  333 444
5
6
7  555 666
[zhangy@localhost test]$ awk 'BEGIN{RS=""}{print $0}' test2
111 222
333 444
333 444
555 666
[zhangy@localhost test]$ awk 'BEGIN{RS="";}{print "<",$0,">"}' test2  //这个例子看着比较明显
< 111 222 >
< 333 444     //这一行和下面一行,是一行
333 444 >
< 555 666 >从这个例子,可以看出当RS为空时,awk会自动以多行来做为分割符。

6,ORS记录输出分符符,默认值是\n

把ORS理解成RS反过程,这样更容易记忆和理解,看下面的例子。

查看复制打印?
[zhangy@localhost test]$ awk 'BEGIN{ORS="\n"}{print $0}' test1  //awk '{print $0}' test1二者是一样的  
111 222  
333 444  
555 666  
[zhangy@localhost test]$ awk 'BEGIN{ORS="|"}{print $0}' test1  
111 222|333 444|555 666| 

[zhangy@localhost test]$ awk 'BEGIN{ORS="\n"}{print $0}' test1  //awk '{print $0}' test1二者是一样的
111 222
333 444
555 666
[zhangy@localhost test]$ awk 'BEGIN{ORS="|"}{print $0}' test1
111 222|333 444|555 666|二,FS与OFS

1,FS指定列分割符

查看复制打印?
[zhangy@localhost test]$ echo "111|222|333"|awk '{print $1}' 
111|222|333  
[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS="|"}{print $1}' 
111 

[zhangy@localhost test]$ echo "111|222|333"|awk '{print $1}'
111|222|333
[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS="|"}{print $1}'
1112,FS也可以用正则

查看复制打印?
[zhangy@localhost test]$ echo "111||222|333"|awk 'BEGIN{FS="[|]+"}{print $1}' 
111 

[zhangy@localhost test]$ echo "111||222|333"|awk 'BEGIN{FS="[|]+"}{print $1}'
1113,FS为空的时候

查看复制打印?
[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $0}' 
1 1 1 | 2 2 2 | 3 3 3 

[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $0}'
1 1 1 | 2 2 2 | 3 3 3当FS为空的时候,awk会把一行中的每个字符,当成一列来处理。

4,RS被设定成非\n时,\n会成FS分割符中的一个

查看复制打印?
[zhangy@localhost test]$ cat test1  
111 222  
333 444  
555 666  
[zhangy@localhost test]$ awk 'BEGIN{RS="444";}{print $2,$3}' test1  
222 333  
666 

[zhangy@localhost test]$ cat test1
111 222
333 444
555 666
[zhangy@localhost test]$ awk 'BEGIN{RS="444";}{print $2,$3}' test1
222 333
666222和333之间是有一个\n的,当RS设定成444后,222和333被认定成同一行的二列了,其实按常规思想是二行的一列才对。

5,OFS列输出分隔符

查看复制打印?
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1,$2}' test1  
111|222  
333|444  
555|666  
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1 OFS $2}' test1  
111|222  
333|444  
555|666 

[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1,$2}' test1
111|222
333|444
555|666
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1 OFS $2}' test1
111|222
333|444
555|666test1只有二列,如果100列,都写出来太麻烦了吧。

查看复制打印?
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $0}' test1  
111 222  
333 444  
555 666  
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{NF=NF;print $0}' test1  
111|222  
333|444  
555|666 

[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $0}' test1
111 222
333 444
555 666
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{NF=NF;print $0}' test1
111|222
333|444
555|666为什么第二种方法中的OFS生效呢?个人觉得,awk觉查到列有所变化时,就会让OFS生效,没变化直接输出了。

分享到:
评论

相关推荐

    LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS

    ### Linux中AWK内建变量FS、NF、NR、RT、RS、ORS、OFS详解 #### 一、概述 AWK是一种强大的文本处理工具,主要用于格式化文本数据,广泛应用于Linux/Unix环境中。它拥有丰富的内置变量和函数,使得用户能够方便地...

    AWK中FNR和NR,OFS和FS,RS和ORS.txt

    在深入探讨AWK中FNR和NR,OFS和FS,RS和ORS这些核心概念之前,我们先简要回顾一下AWK的基本功能。AWK是一种强大的文本处理工具,主要用于模式扫描与处理语言,广泛应用于数据处理、报告生成、格式转换等场景。其核心...

    awk中RS、ORS、FS、OFS的区别和联系小结

    在awk编程语言中,RS(Record Separator)、ORS(Output Record Separator)、FS(Field Separator)和OFS(Output Field Separator)是四个重要的变量,它们分别用于处理输入和输出的数据分割。以下是对这些变量的...

    awk详细用法小结awk awk

    ### awk详细用法小结 #### 一、awk简介与版本 awk是一种强大的文本分析工具,主要用于Linux/Unix系统下的数据处理与报告生成。它支持正则表达式、模式匹配和复杂的文本处理功能,是系统管理员和程序员进行数据处理...

    awk用法__都是例子

    awk 'BEGIN {FS="[: \t|]"} {print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。 示例 5:从文件中读取awk命令 awk -f awkfile file 通过文件 awkfile 的内容依次进行控制。 示例 6:...

    Awk入门教程 《Awk A Tutorial and Introduction - by Bruce Barnett》

    Awk入门教程。作者 Bruce Barnett 注:英文版。以下是目录 Why learn AWK? Basic Structure Executing an AWK script Which shell to use with AWK? Dynamic Variables The Essential Syntax of AWK ...

    awk教程所速度

    awk的内置变量,如FS和OFS分别代表输入和输出的字段分隔符,NF和NR分别代表当前输入行中的字段数量和记录数量,RS和ORS分别是输入和输出的记录分隔符。 在执行awk脚本时,一般需要指定一个shell环境。awk支持多种...

    详解著名的awk_oneliner

    - **特殊变量**: `awk` 提供了一系列特殊变量,如 `FNR`, `NR`, `NF`, `FS`, `OFS`, `RS`, `ORS` 等,这些变量可以用来控制 `awk` 的行为。例如,`FNR` 和 `NR` 分别表示当前行在当前文件和所有已读文件中的行数,`...

    unix之AWK使用小解

    AWK是一种强大的文本处理工具,在Unix和类Unix操作系统中广泛使用。它不仅能够高效地处理数据,还具备一定的编程能力,可以用来编写复杂的脚本。 #### 二、基本语法与参数 AWK的基本语法结构如下: ```bash awk '...

    linux-shell脚本命令:awk命令简介

    Linux系统中的awk命令是一个功能强大的文本处理工具,它可以对输入(通常是文件)进行模式扫描和处理。awk命令常用于在Linux shell脚本中进行数据提取、文本转换、数据报告生成等操作。本文将对awk命令的基本知识...

    awk-培训.docx

    在Linux系统中,awk是一种强大的文本分析工具,尤其在处理数据和日志文件时非常有用。awk其实有多个版本,包括awk、nawk和gawk,而在CentOS系统中默认使用的是gawk。awk的工作原理是对文本文件的每一行进行处理,...

    linux-awklinux-awk

    此命令用于找出 `/etc/passwd` 文件中 UID 在 1000 至 60000 之间的用户。 #### 13. 几个实例 - 打印文件的第二列:`$ awk '{print $2}' filename` - 统计文件中的行数:`$ awk 'END{print NR}' filename` - 替换...

    awk 工具用法说明

    `awk`是一种强大的文本处理工具,在Linux和Unix环境中非常常见。它主要用于提取、分析和处理文本文件中的数据。`awk`支持复杂的条件判断与循环操作,可以方便地进行数据分析、统计计算等工作。 #### 二、awk的基本...

    awk 资料 网上收集

    其中`BEGIN`块中的`FS`和`OFS`分别设置了输入字段和输出字段的分隔符。 #### 三、进阶功能 ##### 3.1 BEGIN和END特殊块 除了基本的模式-动作结构之外,AWK还支持BEGIN和END这两个特殊块,它们分别在处理任何输入...

    sed and awk 101 hacks.pdf

    - **FS、OFS、RS、ORS**:Awk预定义的输入和输出字段分隔符和记录分隔符。 - **NR、FILENAME、FNR**:NR是当前处理的记录总数,FILENAME是当前处理的文件名,FNR是当前文件的记录数。 **Awk变量的操作符** - **变量...

    awk命令详解

    `awk`是一种强大的文本处理工具,常用于Linux/Unix环境中。它能够通过指定的模式或规则来读取、处理并输出文本数据。 ### awk 命令概述 #### 命令格式 ```bash awk [options] 'awk_script' input_file1 [input_...

    sed&awk101 Hacks

    awk内置变量如FS(输入字段分隔符)、OFS(输出字段分隔符)、RS(记录分隔符)、ORS(输出记录分隔符)、NR(记录序号)、FILENAME(当前处理的文件名)、FNR(文件中的NR)、以及每行的字段总数(NF)。...

    awk.cheat.sheet

    ### AWK 快速参考指南 #### 一、概述 AWK 是一款强大的文本处理工具,由 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 在 20 世纪 70 年代末共同开发。AWK 语言的主要功能在于能够方便地对数据进行...

Global site tag (gtag.js) - Google Analytics