将Linux服务器的文本文件中的行与条件组合

将Linux服务器的文本文件中的行与条件组合,linux,perl,grep,Linux,Perl,Grep,我在Linux服务器上的文本文件中有如下记录- telephone = 1111 a=1 b=2 telephone = 2222 a=1 b=2 c=3 telephone = 3333 a=1 b=2 c=3 d=4 我需要像这样- telephone = 1111, a=1, b=2 telephone = 2222, a=1, b=2, c=3 telephone = 3333, a=1, b=2, c=3, d=4 Grep或perl命令都可以,只要有助于获得结果。如果您在inpu

我在Linux服务器上的文本文件中有如下记录-

telephone = 1111
a=1
b=2
telephone = 2222
a=1
b=2
c=3
telephone = 3333
a=1
b=2
c=3
d=4
我需要像这样-

telephone = 1111, a=1, b=2
telephone = 2222, a=1, b=2, c=3
telephone = 3333, a=1, b=2, c=3, d=4

Grep或perl命令都可以,只要有助于获得结果。

如果您在
input.txt
文件中有输入,请尝试以下操作:

perl -ne 'chomp; print /^telephone/ ? "\n$_" : ", $_" } { print "\n"' input.txt
编辑:要防止在开始处换行,请执行以下操作:

perl -ne 'chomp; print !/^telephone/ ? ", $_" : $. > 1 ? "\n$_" : "$_" } { print "\n"' input.txt

使用perl一行程序:

perl -ne 'chomp; print !/^telephone/ ? ", " : $. > 1 ? "\n" : ""; print' file.txt
开关

  • -n
    :为输入文件中的每一行创建
    while(){…}
    循环
  • -e
    :告诉
    perl
    在命令行上执行代码
      这也可以通过awk方便地完成:

      awk 'NR == 1 { buf = $0; next } /^telephone/ { print buf; buf = $0; next } { buf = buf ", " $0 } END {print buf}' input.txt
      
      这一行可能会进一步缩短,不过

      编辑:考虑到awk从字符串构建布尔值的方式,它可以:

      awk '/^telephone/ { if(buf) print buf; buf = $0; next } { buf = buf ", " $0 } END {print buf}' input.txt
      
      EDIT2:我添加了我的sed解决方案,它不需要ooga解决方案中的肢体扭曲:

      sed -f myscript input.txt
      
      其中
      myscript
      如下所示:

      #n
      /^telephone/ {
        x
        s/\n/, /gp
        g
        n
        }
      H
      $ {
        g
        s/\n/, /gp
        }
      

      即使是
      sed
      也可以做到这一点

      sed '
        $ {H; b output}
        {
          s/telephone/&/
          t output
            H
            d
          : output
            x
            s/\n/, /g
        }
        1d
      ' file
      

      描述您的需求和要求他人为您编写代码、解释如何编写代码或提供示例或参考的问题都是离题的。请确定有关编程的特定问题。包括尝试的解决方案,解释结果与期望结果的差异,以及您收到的任何错误消息的全文。请阅读以下关于提出好问题的建议:[],]。使用
      gnu awk
      awk'NR>1{$1=RS$1;print}'OFS=“,”RS=“telephone=”file
      ,这在开始时给出了一个空行。谢谢,我编辑了答案以防止出现这种情况。这会在结尾处漏掉一行。