Text-Processing

輸入文件包含什麼類型的數據?

  • April 8, 2018

我有一個包含 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在其他行中。

  1. 如果是,列印“Protein”,否則列印“DNA”

萬一有人對未來感興趣:這是我使用 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

使用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 氨基酸的符號也是蛋白質符號集的一部分。

skip當我們因為確定文件不是 fasta 文件或者它是蛋白質 fasta 文件而退出時,該變數設置為 1。通過在塊中測試這個變數,END我們知道我們到達那裡是由於提前exit還是因為數據用完(在這種情況下,它可能是一個 DNA fasta 文件)。

引用自:https://unix.stackexchange.com/questions/323178