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) 그렇다면 "단백질"을 인쇄하고, 그렇지 않으면 "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 아미노산 기호도 단백질 기호 세트의 일부이기 때문에 여전히 단백질 fasta 파일일 수 있습니다.
이 변수는 파일이 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