次の 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
補間されていない変数の内容が必要です。