将模式与前一行匹配的移动线

时间:2013-06-10 10:29:27

标签: bash sed awk

我有一个结构文件

12312
desc: bleh...
9938
desc: blah...
desc: bloh...
desc: blih...
desc: bluh...
9912
desc: blah...

我希望将符合模式“desc:”的行移动到上一行,或删除行中每行“desc:”前面的'\ n'。

期望的输出:

12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh... 
9912 desc: blah...

我试过

awk '!/desc:/{
 printf "%s ",$0
 getline
 printf "%s \n",$0
}
/desc/{print}' file

没有结果。

实际上所有数据都是awk -F\" '{print $4 "\t" $6}'的输出 也许我可以先做点什么?

6 个答案:

答案 0 :(得分:12)

awk的一种方式:

$ awk '!/^desc:/&&NR>1{print OFS}{printf "%s ",$0}END{print OFS}' file
12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh...
9912 desc: blah...

<强>解释

  • !/^desc:/匹配不以desc:开头的行,不包括文件NR>1中的第一行。
  • {print OFS}在匹配的行之前打印输出字段分隔符。在awk中,默认OFS\n
  • {printf "%s ",$0}打印每一行没有尾随换行符。
  • 读取文件后
  • END{print OFS}添加尾随换行符。

现场演示:http://ideone.com/ajH14u

答案 1 :(得分:11)

sed oneliner

sed ':a $!N;s/\ndesc/ desc/;ta P;D'

将输出

12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh...
9912 desc: blah...

答案 2 :(得分:4)

$ cat file
12312
desc: bleh...
9938
desc: blah...
desc: bloh...
desc: blih...
desc: bluh...
9912
desc: blah...

$ awk '{printf "%s%s",(/^desc:/?OFS:ors),$0; ors=ORS} END{print ""}' file
12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh...
9912 desc: blah...

答案 3 :(得分:3)

Perl解决方案:

perl -pe 's/\n/ /; ! /^desc:/ and print "\n" unless 1 == $.' FILE

答案 4 :(得分:1)

使用

script.vim的内容:

set backup
g/\v^desc/ normal kJ
saveas! output.txt
q!

像以下一样运行:

vim -u NONE -N -S script.vim infile

它将创建一个包含内容的output.txt文件:

12312 desc: bleh...
9938 desc: blah...  desc: bloh...  desc: blih...  desc: bluh...
9912 desc: blah...

答案 5 :(得分:0)

使用“新”GNU 选项 -z,您可以使用

| sed -z 's/\ndesc:/ desc:/g'