だから私は遺伝子のタイトルが書かれたテキストファイルを持っていますが、同じ種にも異なる遺伝子配列があります。そのため、ヘッダー(headers.txt)を抽出して別のファイル(uniqueheaders.txt
)にコピーしました。から重複したアイテムをすべて削除しましたuniqueheaders.txt
。
ループから行を読み取り、ループからuniqueheaders.txt
読み取ってheaders.txt
重複を確認しようとしています。このif
ステートメントは重複を検出し、カウンタをインクリメントしてヘッダーに追加します。これにより、headers.txt
FASTAファイルに再挿入できるように、すべてのヘッダーに番号が付けられます。私のコードは次のとおりです。
while IFS= read -r uniqueline
do
counter=0
while IFS= read headline
do
if [ "$uniqueline" == "$headline" ]
then
let "counter++"
#append counter to the headline variable to number it.
sed "$headline s/$/$counter/" -i headers
if
done < headers.txt
done < uniqueheaders.txt
問題は端末で頻繁にエラーが発生する。
sed: -e expression #1, char 1: unknown command: 'M'
そして
sed: -e expression #1, char 2: extra characters after command
両方のファイルには一意のヘッダー名が含まれています。
Mus musculus
Homo sapiens
Rattus norvegicus
sed
このエラーを回避するには、コマンドをどのように修正する必要がありますか?より良い方法がありますかbash
?
入力例(遺伝子配列は実際には多くの行のパターンを占めていません。)****遺伝子配列はすべてのファイルに含まれています。
Mus musculus
MDFJSGHDFSBGKJBDFSGKJBDFS
NGBJDFSBGKJDFSHNGKJDFSGHG
Rattus norvegicus
SNOFBDSFNLSFSFSFSJFJSDFSD
Mus musculus
NJALDJASJDLAJSJAPOJPOASDJG
DSFHBDSFHSDFHDFSHJDFSJKSSF
希望の出力:
Mus musculus1
MDFJSGHDFSBGKJBDFSGKJBDFS
NGBJDFSBGKJDFSHNGKJDFSGHG
Rattus norvegicus
SNOFBDSFNLSFSFSFSJFJSDFSD
Mus musculus2
NJALDJASJDLAJSJAPOJPOASDJG
DSFHBDSFHSDFHDFSHJDFSJKSSF
答え1
awk
私は基本的なソリューションを思いついた。
ヘッダーファイルには特定のIDがないため、一意のヘッダーを含むヘッダーファイルを最初に読み取り、次に実際のシーケンスファイルを2回読み取る「2ファイル2段階」アプローチを実行します。ファイルが印刷されます。複数回出現するヘッダには、明確にするために番号が付けられます。
awk 'NR==FNR{tot[$0]=0;next}
!final {if ($0 in tot) {tot[$0]++};next}
final && ($0 in tot) {if (tot[$0]>1) $0=$0 (++cnt[$0])}1' uniqueheaders.txt sequence.txt final="1" sequence.txt
NR
グローバルラインカウンタがファイルごとのラインカウンタと同じ場合、処理するFNR
最初のファイル(ここuniqueheaders.txt
)にあることがわかります。次に、配列にタイトルを「ログ」すると、tot
後でタイトルが表示される合計回数が保存されます。- どのように多くのヘッダー行とシーケンスファイル行があるかわからないため、行カウンター変数は、どのファイルにあるかを識別するのに役立ちません(少なくとも特定の実装
awk
に依存したくない場合)。 。1
一度だけ表示されるヘッダーにaを追加することを抑制するには、「シーケンスファイル」(例入力)を2回処理する必要があるため(参照このQ&Aは議論のためのものです)、パラメータとして2回宣言しますが、awk
2番目のパスのフラグを設定します。final
- シーケンスファイルの最初のステップ(
final
まだ設定されていない)では、ヘッダーを含む行のみを調べて(つまり、$0
行全体が配列のインデックスにあるtot
)、合計発生回数カウンタを増やします。 - シーケンスファイルの2番目のパス(現在
final
設定されている1
)では、通常はすべての行を印刷しますが、ヘッダー行である行(配列の$0
インデックスとしても表示されますtot
)はカウンタ(配列に格納されています)cnt
を追加します。私たちはこのヘッダー()に重複があることを知っていますtot[$0]>1
。
ノート特定の基準(空白行で区切られたすべての遺伝子配列)に基づいてシーケンスファイルのヘッダー行を選択できる場合は、外部ファイルは必要なく、単一の呼び出しuniqueheaders.txt
ですべての操作を実行できます。awk