2つのファイルを一致させ、[重複]をフィルタリングします。

2つのファイルを一致させ、[重複]をフィルタリングします。

ファイルが2つあります。

ファイルA

>TCONS_00000075 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAGCGCTACGGTC
CACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTTCCTCATCGAGCAGCAGCAAC
TCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACACGGCAACAACACTTTATACTTGTGTATAAT
>TCONS_00013830 gene=XLOC_006942
AAACACGGTTAGCTTGATATCACTGATGATCGATGGGATAGAGTCAGAGAACATCTTGTTCCTTAATTAT
CTCAATTCGTGAGATGTTGGACGATATCTCGATAGGGAGAGAAGGCGTTGTTCTGGATCATCACCGTGCT
CAGGGGTCAATTTTACACTGAGCAGGGGCAAAGACGTAAATTTTTACTTCCTTACTTGAGTAAGAGCAAG
TTTAATACTACAACCAACTACTACAAACTCCAATTCATTTATAACCAATCTAATAACTTATTCATACAAT
AGTTACCTATAAGCATATACTACACACACAACGTATTGGAATCCTCCGTGCTGCTGCTGGCTACAGATCT

文書B

XLOC_000030
XLOC_000059
XLOC_000210

FileAはFASTAシーケンスファイルです。で始まる各行>はシーケンス名、その下の行はシーケンスです。 FileBに記載されているIDのシーケンスを抽出したいと思います。この場合:

ファイルC

>TCONS_00000075 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAGCGCTACGGTC
CACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTTCCTCATCGAGCAGCAGCAAC
TCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACACGGCAACAACACTTTATACTTGTGTATAAT

私は次のコマンドを試しました。

perl -pe 's/\n//; s/>(.*)/\n>$1\t/' A |grep -f <(awk '{print $1}' B) |sed 's/\t/\n/' | fold -w 60 > C

しかし、うまくいきません。

答え1

ヒント:データベース操作にはデータベースツールを使用してください。

検索自体を実行するのではなく、何かを見つけるメカニズムを調べるのにすべての時間を費やし、何かを見つけるコマンドが、、のperl長いsed組み合わせawkであり、grepモデム回線ノイズに似て始めたら、今考えてみる時間です。それ物理データベースツールの使用あなたのためデータベースカスタムクエリを1つにまとめる代わりにテキスト処理ツール。

遺伝子が(「XLOC_000030」、「XLOC_000059」、「XLOC_000210」)に位置するRNAから*を選択する。
使い方ははるかに簡単です。

つまり、いくつかのテキスト処理モデム回線ノイズがあります。

作業を重複しないでください。

データベースをレコードごとに複数の行からレコードごとに1行に動的に変換しています。毎回クエリするのではなく、一度だけ実行してください。一人はMakefileこう言いました。

フラットキー:A
        sed -e '/^>/s/$$/ /;:a;$$!N;s/\n //;ta;s/^>//;P;D' $^ >[Eメール保護]
        MV[Eメール保護]$@

makeその後、A何かが変わるたびに実行してください。 (makeこの行の先頭にあるスペースが文字であることを忘れないでくださいTAB。)

プログラムsedは次のとおりです。

# レコードの最初の行にスペースを追加します。
/^>/s/$$/ /
:ㅏ
#EOFでなければ参加
$!N
#結合行がスペースで始まる場合は、改行とスペースを削除します。
s/\n //
#その場合は繰り返してください。
トップ
#レコード文字の最初の開始を削除します。これは改行文字だからです。
へ/^>//
#バッファからレコード全体を印刷して削除します。その後、再起動してください。
D

お問い合わせ

クエリコマンドが複雑すぎて実際には

grep -f B A. flat > C. flat

クエリ出力を複数の行に再変換すると、行ノイズがより多く発生します。

sed -e 's/^/>/' C.Flat|fold -s -w70|sed -e 's/^[^>]/ /' > C

中間ファイルを省略すると、次のようになります。

grep -f B A.Flat|sed -e 's/^/>/'|fold -s -w70|sed -e 's/^[^>]/ /' > C

そしてまた…

繰り返すと、実際のデータベースツールの方が良いでしょう。多数のレコードがある場合(この質問とは異なる質問で)、実行中の操作を考慮してテキスト処理ツールの方法を使用して検索、挿入、削除することは非常に非効率的です。実際のデータベースはフィールドgeneにインデックスを作成する、比較すると。

答え2

#!/bin/bash
while read line
do
        grep -A 1 $line filea >> filec
done < fileb

関連情報