Bash:重複した項目を検出して番号を付けるネストされたwhileループ

Bash:重複した項目を検出して番号を付けるネストされたwhileループ

だから私は遺伝子のタイトルが書かれたテキストファイルを持っていますが、同じ種にも異なる遺伝子配列があります。そのため、ヘッダー(headers.txt)を抽出して別のファイル(uniqueheaders.txt)にコピーしました。から重複したアイテムをすべて削除しましたuniqueheaders.txt

ループから行を読み取り、ループからuniqueheaders.txt読み取ってheaders.txt重複を確認しようとしています。このifステートメントは重複を検出し、カウンタをインクリメントしてヘッダーに追加します。これにより、headers.txtFASTAファイルに再挿入できるように、すべてのヘッダーに番号が付けられます。私のコードは次のとおりです。

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回宣言しますが、awk2番目のパスのフラグを設定します。final
  • シーケンスファイルの最初のステップ(finalまだ設定されていない)では、ヘッダーを含む行のみを調べて(つまり、$0行全体が配列のインデックスにあるtot)、合計発生回数カウンタを増やします。
  • シーケンスファイルの2番目のパス(現在final設定されている1)では、通常はすべての行を印刷しますが、ヘッダー行である行(配列の$0インデックスとしても表示されますtot)はカウンタ(配列に格納されています)cntを追加します。私たちはこのヘッダー()に重複があることを知っていますtot[$0]>1

ノート特定の基準(空白行で区切られたすべての遺伝子配列)に基づいてシーケンスファイルのヘッダー行を選択できる場合は、外部ファイルは必要なく、単一の呼び出しuniqueheaders.txtですべての操作を実行できます。awk

関連情報