将匹配行与下列行合并,直到下一个匹配

时间:2017-10-02 17:53:35

标签: bash awk sed

我有一个看起来像这样的文件:

# foo
100
202
# bar
330
119
111
# baz
# qux
193

我想把它变成:

foo:100
foo:202
bar:330
bar:119
bar:111
qux:193

我应该使用哪个命令?

2 个答案:

答案 0 :(得分:2)

我建议awk。如果一行以#开头,则将第二列保存到变量a。如果列以变量a的数字打印内容开头,并使用当前行(:)附加$0

awk '/^#/{a=$2}; /^[0-9]/{print a":"$0}' file

输出:

foo:100
foo:202
bar:330
bar:119
bar:111
qux:193

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -rn '/^# /{s///;h;d};G;s/(.*)\n(.*)/\2:\1/p' file

如果模式空间(PS)中的行以#后跟空格开头,请删除这些字符并将结果存储在保留空间(HS)中并删除该行。否则,将HS附加到PS,匹配引入的换行符两侧的值,并使用:作为分隔符进行交换。