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

时间:2014-07-22 21:11:57

标签: 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命令都可以,无论什么都可以帮助获得结果。

4 个答案:

答案 0 :(得分:1)

假设您已在input.txt文件中输入,请尝试以下操作:

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

编辑:在开始时阻止换行:

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

答案 1 :(得分:1)

使用perl one-liner:

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

切换

  • -n:为输入文件中的每一行创建一个while(<>){...}循环。
  • -e:告诉perl在命令行上执行代码。

答案 2 :(得分:0)

这也可以通过 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
  }

答案 3 :(得分:0)

即使sed也可以这样做。

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