搜索模式并将其打印在之前的行上(awk)

Search pattern and print it on the line before (awk)

我有这个文件:

>AX-89948491
CACCTTTT[C/T]ATTTCATTCCTAC
>AX-89940152
AGATGAGA[A/G]TAAAGCTTCTGTC
>AX-89922107
ACAGAAAT[G/T]TATAGATATTACT

我需要找到模式“[A-Z]/[A-Z]”(它必须每两行出现一次);像这样把它放在线上:

>AX-89948491-[C/T]
CACCTTTT[C/T]ATTTCATTCCTAC
>AX-89940152-[A/G]
AGATGAGA[A/G]TAAAGCTTCTGTC
>AX-89922107-[G/T]
ACAGAAAT[G/T]TATAGATATTACT

我做到了:

awk 'tmp=/\[[A-Z]\/[A-Z]]/{if (a && a !~ /\[[A-Z]\/[A-Z]]/) print a"-"$tmp; print} {a=[=12=]}' my_file

但这给出了整行,而不是模式。

有什么帮助吗?

您可以打印上一行加上模式的当前匹配部分,假设它每 2 行出现一次:

awk '
match([=10=], /\[[A-Z]\/[A-Z]]/) {
  m = substr([=10=], RSTART, RLENGTH)
  print prev "-" m ORS [=10=]
}
{prev = [=10=]}
' my_file

输出

>AX-89948491-[C/T]
CACCTTTT[C/T]ATTTCATTCCTAC
>AX-89940152-[A/G]
AGATGAGA[A/G]TAAAGCTTCTGTC
>AX-89922107-[G/T]
ACAGAAAT[G/T]TATAGATATTACT

仅使用您显示的示例,请尝试执行以下 awk 程序。这是 tac + awk + tac 解决方案。简单的解释是使用 tac 以相反的行顺序(从下到上)打印输出,将其发送到 awk 程序以获取 [[A-Z]/[A-Z] 并将其匹配值保存到 val变量并打印该行,如果 match 函数没有任何匹配的正则表达式值,则打印该行(基本上是我们需要添加 [[A-Z]/[A-Z] 值的行)以及 - 和 val 值.现在再次将此输出传递给 tac 以获得与 OP 向我们展示的示例完全相同的格式的输出。

tac Input_file | 
awk '
  match([=10=],/\[[A-Z]\/[A-Z]]/){
    val=substr([=10=],RSTART,RLENGTH)
    print
    next
  }
  {
    print [=10=]"-"val
  }
' | tac