如果第 n 行满足条件,则打印第 n-1 行(和 n)

如果第 n 行满足条件,则打印第 n-1 行(和 n)

我有一个 fasta 文件,看起来像这样:

>19 dna:chromosome chromosome:NCBIM37:19:1:61342430:1 37330562 ID13406 U -
TACATGGGTGACAAGGAGGTCAGGTGTTA
>19 dna:chromosome chromosome:NCBIM37:19:1:61342430:1 37330584 ID57999 U -
TGTCAAAGGAAGCCTTACTATACATGG

以“>”开头的行是标题,其他行是数据。

我想删除所有短于 26 或长于 31 的非标题行。我还想删除属于这些行的标题(即上一行。)

到目前为止我的代码

awk '
{if (substr($0,1,1) == ">") 
    {header=$0} 
else 
    {if ((length($0) > 25) && (length($0) < 32)) {print $header "\n" $0}}}' *

但这给了我错误消息

awk '{if (substr($0,1,1) == ">") {header=$0} else {if ((length($0) > 25) && (length($0) < 32)) {print $header $0}}}' *
), name "header"ld $(>19 dna:chromosome chromosome:NCBIM37:19:1:61342430:1 37330562 ID13406 U -
 input record number 2, file Cluster_1.fas
 source line number 1

答案1

看起来解决这个问题更容易sed

sed '/^>/{N;/\n.\{26,31\}$/!d}'

小解释:

/^>/与带有标题的字符串匹配
{}将命令组应用于模式
N将下一行附加到模式
/\n.\{26,31\}$/检查符号计数是否在 26 .. 31 之间
!d如果匹配则通过它,否则删除

答案2

你的问题是你说:

print $header

..代替:

print header

您想要一个未插值的变量内容。

相关内容