ファイルが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