• 把文件每隔三行合并成一行(awk之RS、ORS与FS、OFS)


    比如文本如下:
    1
    2
    3
    a
    b
    c

    合并后的结果是:
    1 2 3
    a b c

    #awk '{if(NR%3!=0)ORS=" ";else ORS="
    "}1' 5.txt
    1 2 3
    a b c

    awk之RS、ORS与FS、OFS

    转自http://www.cnblogs.com/fhefh/archive/2011/11/16/2251656.html

    RS:Record Separator,记录分隔符

    ORS:Output Record Separate,输出当前记录分隔符

    FS:Field Separator,字段分隔符

    OFS:Out of Field Separator,输出字段分隔符

    PS:RS、ORS、FS、OFS的英文解释绝不是这样的,这里只是解释清楚。建议去阅读awk的英文读物,其中解释了缩写的含义。

    什么是field(字段),什么是record(记录行)?

    示例:

    1.txt

    1. i am a student.
    2. i like to swim
    3. hello moto

    1代表第一个记录行,2代表第二个记录行,3代表第三个记录行。通过观察我们可以知道总共有3个记录行(record)。

    看看第一行:“i am a student”,这一行的每个单词都是一个字段(field)。“i”是一个字段,“am”是一个字段,“a”是一个字段,“student”是一个字段,该行总共有4个字段。

    RS与ORS

    RS:记录行分隔符

    示例:

    1.txt

    1. a
    2. b
    3. c
    4. d
    5. e

    该文本总共有5行,每一行都有一个换行符“ ”。所以每行记录都是以“ ”为一个(换行的)标志。

    可以用一下方法来理解:

    找到某某标志,让每个某某后的内容重新变成一行

    示例

    1.txt

    a|b|c

    代码:awk 'BEGIN{ RS="|"; } { print $0 }'

    a

    b

    b

    ORS:可以看成RS的逆向过程

    示例

    1.txt

    a

    b

    c

    可以这样理解:

    观察每一行的“换行符号”,然后将“换行符号”替换成你想要的符号。

    awk 'BEGIN{ ORS="----" }{ print $0 }' 1.txt

    a----b----c----

    FS:字段分隔符

    FS默认值为“ (空格)”,如“hello moto”.

    在“hello moto”中有一个空格,空格就是hello与moto的分隔符(separator),而hello与moto就为字段(files)。awk以空格来区分。

    在看看“i----love----you”,如果我们用命令“awk “{ print $1 }””会看到结果为:

    i----love----you

    如果想打印出三个字母,通过观察可发现“----”为分隔符。

    awk 'BEGIN{ FS="----";}{ print $1,$2,$3 }' filename

    i love you

    OFS:输出的字段分隔符。

    这么解释吧,如上例中“i----love----you”,“----”为分隔符(FS),如果我们想改为用其他符号显示可以这样:

    awk 'BEGIN{ FS="----";OFS="*****" }{ print $1,$2,$3 }' filename

    i*****love*****you

    其实OFS还有一个例子
    echo "abc" | awk '{ OFS="." } { NF=NF; print NF,$0}'
    结果
    1.abc

    PS:RS与ORS可以说成是一个互逆的过程(↔)也可以看成一个替换的过程,但是看成互逆的过程比较好理解;FS与OFS就是一个替换的过程。

  • 相关阅读:
    bzoj2431[HAOI2009]逆序对数列
    wikioi1082【线段树练习 3 】
    bzoj1715[Usaco2006 Dec]Wormholes 虫洞
    bzoj1676[Usaco2005 Feb]Feed Accounting 饲料计算
    bzoj1677[Usaco2005 Jan]Sumsets 求和
    bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声
    bzoj1680[Usaco2005 Mar]Yogurt factory
    bzoj1681[Usaco2005 Mar]Checking an Alibi 不在场的证明
    bzoj2705[SDOI2012]Longge的问题
    bzoj1627[Usaco2007 Dec]穿越泥地
  • 原文地址:https://www.cnblogs.com/chenjiahe/p/6164673.html
Copyright © 2020-2023  润新知