10000以上のテキストファイルを含むフォルダがあります。ファイルは2種類あります。
Type1:「DNA」と呼ばれる
フォーマット:
「>」で始まるヘッダ情報
2行目以降は、「A」、「T」、「G」、「C」、「N」の文字のみが含まれます。
例:
ファイル名: "ABC123.tab"
>DNA1_example
TGTTGTTGTTGTTGCTGCTGTTGTTGCTGCTGTTGTTGTTGTTGTTGCTGCTGTTGTTGTTGTTGTTGCTGCTGCTGTTGTTGCTGTTGTCTTTGAGGTTGGAGATTAGGACGATTCGGCATGTTGTTGTTCCATGATCCGATCCCAACACCAGGACTAGGCTGTCCTTGCAAACTGATACCGGGACTCGATCTGGCACCAACTCCTGGCTGCGGAGAAAGTTGGGATCCGTGTTGTTGTTGTTGAAAACCTTGTGGAGGTGGTCCTATGCGAGGCGACACTTGAGCCGAATTAAACGGTGATAGCCGAGAAGATGGACCTCCAGGAGCAAAATTATTGCCGTTGTTGTTATTGACAATTTGTGCCTGAGGGCTTTGATTGTAGTTGCCACTATTGGCCGTGCTCAAACTGCTCATCGGACCGTGAGGTGAAAAAGGTGGTTGCATTGGGCGCTGACTGGGGGAGATTTGAGACGCTAGTGGCCCGCTACCTATTGGACTGC
タイプ2:「タンパク質」と呼ばれる
フォーマット:
「>」で始まるヘッダ情報
2行目以降は、G、A、L、M、F、W、K、Q、E、S、P、V、I、C、Y、H、R、N、D、T文字のみが含まれます。
例:
ファイル名: "DEF123.tab"
>Protein1_example
MRCVLCYKNIAGNKLARFCVFSTSILLSLLSTQAQLSIIPQDELLAAEKMVNSSRWRLLD
私がしたいことは:
1) ファイルを開きます。
2)「>」で始まる行をスキップする
3)他の行にL、M、F、W、K、Q、E、S、P、V、I、Y、H、R、Dの文字が表示されることを確認します。
4) その場合は「タンパク質」を印刷し、そうでない場合は「DNA」を印刷します。
答え1
使用awk
:
for name in folder/*; do
# skip this name if it's not the name of a file
[ ! -f "$name" ] && continue
awk 'NR == 1 && !/^>/ {
printf("Not a fasta file: %s\n", FILENAME)
skip=1; exit
}
!/^>/ && /[LMFWKQESPVIYHRD]/ {
printf("Protein fasta file: %s\n", FILENAME)
skip=1; exit
}
END {
if (!skip) printf("Probably a DNA fasta file: %s\n", FILENAME)
}' "$name"
done
これにより、名前付きディレクトリのすべての名前が繰り返されますfolder
。ファイルではなくサブディレクトリの名前をスキップし、見つかったawk
ファイルにスクリプトを適用します。
それから
>
最初の行の先頭にあるaをテストして、ファイルがfastaファイルであることを確認してください。>
最初の行の先頭に何もない場合は、ファイルエラーを報告して終了します。で始まらない各行について、その行に
>
タンパク質記号があるかどうかをテストします。存在する場合は、そのファイルをProtein Fastaファイルとして報告して終了します。最後に、そこに着いたら、可能これはDNA fastaのドキュメントとコードに報告されています。その可能性はほとんどありませんが、DNAアミノ酸シンボルもタンパク質シンボルセットの一部であるため、まだタンパク質ファスタファイルである可能性があります。
この変数は、ファイルがファスタファイルでない場合、またはタンパク質ファスタファイルであると判断して終了したときにskip
1に設定されます。END
ブロック内でこの変数をテストすることで、早く到着したのでそこに到達したのかexit
、それともデータが不足してそこに到達したのかを知ることができます(この場合はDNA fastaファイルかもしれません)。
答え2
将来に興味がある人がいる場合は、Perlを使用する簡単で簡単な方法は次のとおりです。
#!usr/bin/perl
use warnings;
use strict;
open(FILE, "ABC123.fa");
my $line_=<FILE>;
$line_=readline(*FILE) if $line_=~/>/;
close(FILE);
if($line_ =~ /L|M|F|W|K|Q|E|S|P|V|I|Y|H|R|D/){
print "Protein\n"
}
else {
print "Nucleotide\n"
}
以下を使用して実行します。
perl format_tester.pl
このコードを実行するたびに、sedメソッドを使用して「ABC123.fa」を「DEF123.fa」に置き換えます。
sed -i 's/ABC123.fa/DEF123.fa/g' format_tester.pl