In de bioinformatica worden DNA-, RNA- of eiwitsequenties doorgaans opgeslagen in tekstbestanden die opgemaakt zijn volgens het FASTA formaat. De sequenties zelf worden voorgesteld als strings die enkel bestaan uit hoofdletters of kleine letters. FASTA bestanden kunnen meerdere records bevatten, waarbij elke record één enkele sequentie voorstelt. Een record bestaat uit één regel met een beschrijving, gevolgd door één of meer regels met de opeenvolgende fragmenten van de sequentie. Regels met een beschrijving kunnen onderscheiden worden van regels met een sequentiefragment door het feit dat het eerste karakter van de beschrijvingsregels een groter-dan teken (>) is.
Het FASTA bestand in onderstaand voorbeeld bevat drie records. Om aan te geven dat het aantal sequentiekarakters per regel niet vast ligt, hebben we de sequenties in het voorbeeld telkens opgesplitst over verschillende regels die een vast aantal karakters bevatten. Maar zelfs binnen één record is het toegelaten om te werken met sequentiefragmenten van variabele lengte.
>seq1
AAAAAAAAGGTGCGGAGGAAAGCAACACATTTGTTCCTCAGGACTCTTCA
GCGGGAGATATCTGCA
>seq2
CTCTCGGAAGTTTGTCCGCACCGACATAAATAGACTGATACTGATCAGGGGGACGGTACG
ACCCACTCTGTCGATCGAACCAGTGACCT
>seq3
aaaaaaaaacgtcagaaacgtgagtagggttacccacacgcatctaagaatgctcgggcaatgtgacggt
atgaagttgagagc
Schrijf een bash shell script format waaraan een FASTA bestand moet doorgegeven worden. Het shell script moet de records in het FASTA bestand uitschrijven naar stdout, rekening houdend met de volgende opties die het shell script moet ondersteunen:
optie -u: schrijf alle sequenties uit in hoofdletters; standaard worden de letters van de sequenties niet aangepast
optie -l: schrijf alle sequenties uit in kleine letters; standaard worden de letters van de sequenties niet aangepast
optie -w <int>: schrijf alle sequenties uit in fragmenten van $$n$$ letters per regel; enkel het laatste fragment van een sequentie mag eventueel korter zijn dan $$n$$ letters; hierbij is $$n$$ het verplichte argument dat moet doorgegeven worden aan de optie -w; als de optie -w niet gebruikt wordt bij het uitvoeren van het shell script, dan moet standaard de waarde $$n=80$$ gebruikt worden
Het shell script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, argument bij een optie moet niet noodzakelijk van de optieletter gescheiden worden door witruimte, …. Daarnaast moet het shell script de volgende foutafhandeling voorzien:
als niet de gepaste opties doorgegeven worden (enkel ondersteuning voor de opties -u, -l en -w, waarbij verplicht een argument aan de optie -w moet doorgegeven worden), dan moet het shell script een gepaste boodschap uitschrijven naar stderr en eindigen met exit status 1
de opties -u en -l mogen nooit samen gebruikt worden; als dat wel het geval is, dan moet het shell script een gepaste boodschap uitschrijven naar stderr en eindigen met exit status 2
als het argument dat aan de optie -w wordt doorgegeven geen natuurlijk getal is, dan moet het shell script een gepaste boodschap uitschrijven naar stderr en eindigen met exit status 3
als er niet juist één argument wordt doorgegeven aan het shell script dat een leesbaar gewoon bestand is, dan moet het shell script een gepaste boodschap uitschrijven naar stderr en eindigen met exit status 4
Zie onderstaande voorbeeldsessie voor wat we telkens bedoelen met de gepaste boodschap die moet uitgeschreven worden naar stderr.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat het bestand seq.fasta1 zich in de huidige directory bevindt.
$ cat seq.fasta2
>seq1
AAAAAAAAGGTGCGGAGGAAAGCAA
CACATTTGTTCCTCAGGACTCTTCG
CGGGAGATATCTGCA
>seq2
CTCTCGGAAGTTTGTCCGCACCGACATAAATAGACTGATACTGATCAGGGGGACGGTACG
ACCCACTCTGTCGATCGAACCAGTGACCT
>seq3
aaaaaaaaacgtcagaaacgtgagtagggttacccacacgcatctaagaatgctcgggcaatgtgacggt
atgaagttgagagc
$ format seq.fasta3
>seq1
AAAAAAAAGGTGCGGAGGAAAGCAACACATTTGTTCCTCAGGACTCTTCAGCGGGAGATATCTGCA
>seq2
CTCTCGGAAGTTTGTCCGCACCGACATAAATAGACTGATACTGATCAGGGGGACGGTACGACCCACTCTGTCGATCGAAC
CAGTGACCT
>seq3
aaaaaaaaacgtcagaaacgtgagtagggttacccacacgcatctaagaatgctcgggcaatgtgacggtatgaagttga
gagc
$ format -u -w 60 seq.fasta4
>seq1
AAAAAAAAGGTGCGGAGGAAAGCAACACATTTGTTCCTCAGGACTCTTCAGCGGGAGATA
TCTGCA
>seq2
CTCTCGGAAGTTTGTCCGCACCGACATAAATAGACTGATACTGATCAGGGGGACGGTACG
ACCCACTCTGTCGATCGAACCAGTGACCT
>seq3
AAAAAAAAACGTCAGAAACGTGAGTAGGGTTACCCACACGCATCTAAGAATGCTCGGGCA
ATGTGACGGTATGAAGTTGAGAGC
$ format -l -w42 seq.fasta5
>seq1
aaaaaaaaggtgcggaggaaagcaacacatttgttcctcagg
actcttcagcgggagatatctgca
>seq2
ctctcggaagtttgtccgcaccgacataaatagactgatact
gatcagggggacggtacgacccactctgtcgatcgaaccagt
gacct
>seq3
aaaaaaaaacgtcagaaacgtgagtagggttacccacacgca
tctaagaatgctcgggcaatgtgacggtatgaagttgagagc
$ format -L seq.fasta6
Syntaxis: format [-w breedte] [-u|-l] FASTA
$ echo $?
1
$ format -ul seq.fasta7
Syntaxis: format [-w breedte] [-u|-l] FASTA
$ echo $?
2
$ format -w DERTIG seq.fasta8
Syntaxis: format [-w breedte] [-u|-l] FASTA
$ echo $?
3
$ format seq1.fasta seq2.fasta
Syntaxis: format [-w breedte] [-u|-l] FASTA
$ echo $?
4