【问题标题】:Concatenating previous line with current line based on condition根据条件将前一行与当前行连接起来
【发布时间】:2014-01-27 05:42:17
【问题描述】:

我需要帮助编写以下脚本。如果当前行以#STOP# 开头,而前一行也以"#STOP#" 开头,则只需打印该行。 如果当前行以"#STOP#" 开头并且上一行也以"MSG#" 开头,则将上一行连接到当前行。

输入文件:

#STOP# |package1| function1
#STOP# |package2|   function2
#MSG#  |package3| SQL1
#STOP# |package4|  MapperBean
#MSG#  |package3|  SQL2
#STOP# |package4|  MapperBean
#STOP# |package4|   MapperBean
#STOP# |package5|  ActionItem

期望的输出:

#STOP# |package1| function1
#STOP# |package2|   function2
#STOP# |package4|  MapperBean  #MSG#  |package3| SQL1
#STOP# |package4|  MapperBean  #MSG#  |package3|  SQL2
#STOP# |package4|   MapperBean
#STOP# |package5|  ActionItem

【问题讨论】:

    标签: awk concatenation conditional-statements lines


    【解决方案1】:

    awk 的一种方式:

    $ awk '$1=="#MSG#"{msg=OFS $0;next}{print $0(msg?msg:"");msg=""}' file
    #STOP# |package1| function1 
    #STOP# |package2|   function2 
    #STOP# |package4|  MapperBean #MSG#  |package3| SQL1
    #STOP# |package4|  MapperBean #MSG#  |package3|  SQL2
    #STOP# |package4|   MapperBean 
    #STOP# |package5|  ActionItem 
    

    【讨论】:

    • 你可以去掉括号,但它的可读性可能会差一些。 {print $0,msg?msg:"";msg=""}
    • @Jotne 声明然后变得模棱两可...Gawk 会好的,BSD awk 会抱怨。更安全,更易读,零收益。
    • 我想三元并不是严格要求的,打高尔夫球你可以选择类似awk '/^#MSG#/{m=$0;next}{print $0,m;m=""}' file shorted 但将是sed 解决方案。
    • @sudo_O:这是一个很好的简化,但是,正如您的回答一样,您最终会附加一个单独的空格字符。由于使用,print,在未连接行的末尾。因此,您可能需要print $0 (m ? " "m : "");m=""
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2012-02-17
    相关资源
    最近更新 更多