【问题标题】:Using awk to join lines following a match使用 awk 加入匹配后的行
【发布时间】:2016-08-15 15:06:27
【问题描述】:

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

>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

这显然不是我想要做的。

任何帮助将不胜感激!

谢谢

【问题讨论】:

标签: bash awk


【解决方案1】:

这个 awk 单行代码应该适用于您的示例:

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

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

【讨论】:

  • awk '/^>/{printf "%s,",$0;next}7' 文件(%s 后缺少逗号),以获得准确的要求结果。我无法编辑答案,因为它只有 1 个字符。
  • 它似乎工作正常,谢谢!你能解释一下为什么在“>”之前添加“^”吗? (我是 awk 的初学者,我以前使用过这样的命令:awk '/pattern/{ print $0 }' 文件,但我从来不需要在模式前添加 '^'。
  • ^> 是正则表达式,它匹配以> @arielle 开头的行
  • 我也对命令末尾的“7”很好奇,我试着查了一下,但我不确定这是做什么用的。
  • @arielle 非零数字在 awk 中执行默认操作:print
【解决方案2】:

另一个极简主义者awk

$ awk 'ORS=/^>/?",":RS' file 

【讨论】:

  • 想知道你是怎么想出这样的想法的.. ++
  • 我已经考虑过您的答案,并且我了解它的工作原理,除了最后一部分 (:RS)。我知道 RS 是记录分隔符,但我只以 RS= 的形式看到它。在代码末尾使用它的目的是什么,为什么在它之前有一个':'?谢谢!
  • 三元运算符? 将输出记录分隔符设置为逗号或默认值(即 RS)。同样,您可以将其设置为换行符"\n",但这更短。
【解决方案3】:

使用gnu awk,您也可以这样做:

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

【讨论】:

    【解决方案4】:
    awk '{printf "%s%s", $0, (NR%2 ? "," : ORS)}' file
    

    【讨论】:

    • 这是一个低质量的答案。你可以做得更好!
    • @jpaugh 在什么方面是低质量的?这是一个使用基本 awk 结构且没有冗余操作符的微不足道的问题的微不足道的解决方案。如果遇到这个问题,这正是我在自己的代码中使用的。你还想要什么?
    • 好吧,它没有解释它的作用,这总是很重要的。仅供参考,我在低质量的审核队列中发现了这个,所以我不是唯一一个这么想的人。
    • 不,解释并不总是很重要。它是一种工具,可以自动将简短的答案添加到低质量审查队列中,供了解该领域的人决定该答案是否是低质量的。如果您不知道该域,请将其留给其他人来确定。查看此页面上所有其他没有解释的答案,因为解决方案只是微不足道的。为此添加解释就像在代码i++ 中添加incrementing i 注释一样。
    • 想想你的听众。知道awk 足够了解这样一个“微不足道”的答案的人几乎不需要问;我知道你可能很忙,回答琐碎的问题并不是你一天中的重头戏。尽管如此,为专家解答所付出的每一点努力都可以将新手试图理解的努力减少十倍。
    【解决方案5】:
    paste -d, - - < file
    

    如果您的文件完全由成对的行组成,则粘贴将完成这项工作,如您的示例所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多