我有一个 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
您想要一个未插值的变量内容。