我有一个如下所示的列表:
>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
这显然不是我想做的事。
非常感谢任何帮助!
由于
答案 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
如果您的文件完全由成对的行组成,粘贴将完成工作,如您的示例所示。