我有一个结构文件
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}'
的输出
也许我可以先做点什么?
答案 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}
添加尾随换行符。 答案 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)
使用vim
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'