我有一个包含超过 10000 个文本文件的文件夹。文件可以有两种类型:
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) 如果是,打印“Protein”,否则打印“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 文件。如果>
第一行开头没有,则报告文件错误并退出。对于不以 开头的每一行
>
,它测试该行是否有蛋白质符号。如果存在,它将将该文件报告为蛋白质 fasta 文件并退出。最后,如果我们到达那里,那就是可能DNA fasta 文件和代码报告了这一点。请注意,即使不太可能,它仍然可能是蛋白质 fasta 文件,因为 DNA 氨基酸的符号也是蛋白质符号集的一部分。
当我们确定该文件不是 fasta 文件或者它是蛋白质 fasta 文件而退出时,该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