使用awk在匹配后加入行

时间:2016-08-15 15:06:27

标签: bash awk

我有一个如下所示的列表:

>aaa(+)
AAAAAAAAAA
>bbb(+)
BBBBBBBBBBBBBBBB
>ccc(-)
CCCCCCC

我希望在'(+)'之后使用awk加入下一行。或者'( - )',用逗号分隔符,使它看起来像这样:

>aaa(+),AAAAAAAAAAA
>bbb(+),BBBBBBBBBBBBBBBB
>ccc(-),CCCCCCC

我已经尝试了以下(在bash中):

cat $file | awk '/(-)/||/(+)/{if (x)print x;x"";}{x=(!x)?$0:x","$0;}END{print x;}' > $new_file

但这似乎给出了这样的结果:

>aaa(+),AAAAAAAAAAA
>aaa(+),AAAAAAAAAAA,>bbb(+),BBBBBBBBBBBBBBBB
>aaa(+),AAAAAAAAAAA,>bbb(+),BBBBBBBBBBBBBBBB,>ccc(-),CCCCCCC

这显然不是我想做的事。

非常感谢任何帮助!

由于

3 个答案:

答案 0 :(得分:4)

这个awk单行应该适用于你的例子:

awk '/^>/{printf "%s,",$0;next}7' file

它以>开头的行与其下面的行连接。如果(+/-)是关键,您可以将模式更改为您感兴趣的密钥。

答案 1 :(得分:1)

使用gnu awk你也可以这样做:

$ awk -v RS=">"  '$0 != ""{ printf ">%s",gensub(/\)\n/,"),","g")}' file
>aaa(+),AAAAAAAAAA
>bbb(+),BBBBBBBBBBBBBBBB
>ccc(-),CCCCCCC

答案 2 :(得分:0)

paste -d, - - < file
如果您的文件完全由成对的行组成,

粘贴将完成工作,如您的示例所示。