行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一致する場合は通過し、そうでない場合は削除します。

おすすめ記事