Text-Processing
輸入文件包含什麼類型的數據?
我有一個包含 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
我想做的是:
打開文件。
跳過以“>”開頭的行
3)檢查它是否包含以下任何一個字母:L,M,F,W,K,Q,E,S,P,V,I,Y,H,R,D在其他行中。
- 如果是,列印“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
腳本應用於它找到的文件。那麼它
>
通過在第一行的開頭測試 a 來確保文件是 fasta 文件。>
如果第一行開頭沒有,則在文件中報告錯誤並退出。- 對於不以 開頭的每一行
>
,它會測試該行上是否有蛋白質符號。如果有,它將文件報告為蛋白質 fasta 文件並退出。- 最後,如果我們到達那裡,它可能是一個 DNA fasta 文件,並且程式碼會報告這一點。請注意,即使不太可能,它仍然可能是蛋白質 fasta 文件,因為 DNA 氨基酸的符號也是蛋白質符號集的一部分。
skip
當我們因為確定文件不是 fasta 文件或者它是蛋白質 fasta 文件而退出時,該變數設置為 1。通過在塊中測試這個變數,END
我們知道我們到達那裡是由於提前exit
還是因為數據用完(在這種情況下,它可能是一個 DNA fasta 文件)。