输入文件包含什么类型的数据?

输入文件包含什么类型的数据?

我有一个包含超过 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脚本应用于它找到的文件。

那么它

  1. >通过测试第一行开头的a 来确保该文件是 fasta 文件。如果>第一行开头没有,则报告文件错误并退出。

  2. 对于不以 开头的每一行>,它测试该行是否有蛋白质符号。如果存在,它将将该文件报告为蛋白质 fasta 文件并退出。

  3. 最后,如果我们到达那里,那就是可能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

相关内容