搜索模式并将其打印在之前的行上(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
我有这个文件:
>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