6

我有一个结构文件

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}' 也许我一开始就可以做点什么?

4

6 回答 6

13

一种方法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

于 2013-06-10T10:35:52.943 回答
13

sed单线

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

将输出

12312 desc: bleh...
9938 desc: blah... desc: bloh... desc: blih... desc: bluh...
9912 desc: blah...
于 2013-06-10T10:52:27.307 回答
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...
于 2013-06-10T12:45:12.950 回答
3

Perl 解决方案:

perl -pe 's/\n/ /; ! /^desc:/ and print "\n" unless 1 == $.' FILE
于 2013-06-10T10:39:40.593 回答
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...
于 2013-06-10T11:07:57.887 回答
0

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

| sed -z 's/\ndesc:/ desc:/g'
于 2021-04-21T22:30:30.333 回答