HW 5 - Hledání textu v souborech

Termín odevzdání 20.04.2024@23:59 PDT
Povinné zadání 3b
Volitelné zadání 3b
Bonusové zadání není
Počet uploadů 20
Výchozí soubory bab36prga-hw5.zip

Povinné zadání

Rok 2020, v rámci koordinovaného úsilí v boji se SARS-CoV-2 jste dostali za úkol vytvořit program, který v přečteném genomu zvýrazní pouze řádky obsahující geny kódující konkrétní proteiny. Protože je situace značně chaotická a objevují se nové mutace, které laboratoře posílají v nejednotném formátu, rozhodnete se zvolit obecný přístup – zvýrazňujete řádky v textových souborech obsahující zadaný textový řetězec.

Bez použití knihovny <string.h> (nebo podobné) napište program, který ze zadaného souboru vypíše všechny řádky obsahující zadaný řetězec. Budete tak implementovat zjednodušenou verzi programu grep pro příkazový řádek, který je dostupný ve většině operačních systémů Unixového typu.

Program bude volán ve tvaru:

./program PATTERN FILE
kde PATTERN je hledaný řetězec, FILE název souboru.

V případě jakékoli chyby vypište smysluplný důvod chyby na standardní chybový výstup a program bude ukončen s nenulovou návratovou hodnotou.

Program implementujte v souboru grep.c

Pro rozpoznání konce řádku je možné používat znak '\n'.

V případě prázdeného výstupu ukončete program s návratovou hodnotou 1.

Příklad 1

První příklad hledá 7 genů na začátku oblasti kódující spike protein.

 grep AATGTTTGTTTTTCTTGTTTTATTGCC rna-numbered-capitalized.txt 
 ./program AATGTTTGTTTTTCTTGTTTTATTGCC rna-numbered-capitalized.txt 

Obsah vstupního souboru Řetězec PATTERN Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
    1 ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCT
   61 GTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACT
  121 CACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATC
  181 TTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT
  ...
AATGTTTGTTTTTCTTGTTTTATTGCC
21541 CTTGTTAACAACTAAACGAACAATGTTTGTTTTTCTTGTTTTATTGCCACTAGTCTCTAG
žádný 0

Příklad 2

Druhý příklad hledá 7 genů na konci oblasti kódující spike protein.

 grep aacgaacttatggatttgttt rna-numbered.txt 
 ./program aacgaacttatggatttgttt rna-numbered.txt 

Obsah vstupního souboru Řetězec PATTERN Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
    1 attaaaggtttataccttcccaggtaacaaaccaaccaactttcgatctcttgtagatct
   61 gttctctaaacgaactttaaaatctgtgtggctgtcactcggctgcatgcttagtgcact
  121 cacgcagtataattaataactaattactgtcgttgacaggacacgagtaactcgtctatc
  ...
aacgaacttatggatttgttt
25381 ataaacgaacttatggatttgtttatgagaatcttcacaattggaactgtaactttgaag
žádný 0

Příklad 3

Další příklad je motivován praktickou ukázkou, jak v Ubuntu zjistit velikost volné operační paměti z příkazové řádky.

grep MemFr /proc/meminfo
./program MemFr /proc/meminfo

Obsah vstupního souboru Řetězec PATTERN Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
MemTotal:       16430396 kB
MemFree:         4848016 kB
MemAvailable:   11697864 kB
Buffers:         1139932 kB
Cached:          5662728 kB
...
MemFr
MemFree:         4848016 kB
žádný 0

Příklad 4

Příklad na prázdný výstup.

grep NeexistujiciText /proc/meminfo
./program NeexistujiciText /proc/meminfo

Obsah vstupního souboru Řetězec PATTERN Očekávaný výstup Očekávaný chybový výstup Návratová hodnota
MemTotal:       16430396 kB
MemFree:         4848016 kB
MemAvailable:   11697864 kB
Buffers:         1139932 kB
Cached:          5662728 kB
...
NeexistujiciText
žádný žádný 1

Volitelné zadání

Ve volitelné části můžete přidat tři různé funkcionality, za které můžete získat body. Počet argumentů tedy již nebude konstantní a program bude volán ve tvaru:

./program [OPTIONS] PATTERN [FILE]
kde PATTERN je hledaný řetězec, FILE název souboru a OPTIONS jsou volitelné argumenty pro volitelné zadání.

A - Přesměrování na standartní vstup (0.5b)

Pokud nebude zadán argument volitelný argument FILE, bude jako vstup použit stdin. Díky tomu je možné přesměrovat výstup jiného programu a filtrovat tak jeho výstup.

dmesg | grep dvd

Příklad výstupu:

[    2.653604] sr 5:0:0:0: [sr0] scsi3-mmc drive: 48x/48x writer dvd-ram cd/rw xa/form2 cdda tray

B - Regulární výrazy (1b)

Pouze speciální symboly [*,+,?] bez závorkování. Speciální symbol se vyskytuje maximálně jednou.

./program -E PATTERN [FILE]

Regulární výrazy

Příklad B1

Obsah vstupního souboru Řetězec 'colou?r' Řetězec 'colou*r' Řetězec 'colou+r'
color
colour
colouur
colouuur
color
colour
color
colour
colouur
colouuur
colour
colouur
colouuur

C - Obarvení výstupu (1.5b)

Obarvení PATTERN ve výstupu červenou barvou, stejně jako originální grep. Text je možné obarvit v terminálu pomocí přidání přesné sekvence znaku (Escape sequence) před a za obarvovaný text, viz. ANSI escape code. Tato funkcionalita se zapíná následujícím přepínačem:

./program --color=always PATTERN [FILE]

Používejte prosím stejné escape sekvence jako systémový grep, aby bylo možné výstup jednoduše zkontrolovat.

Před obarvený test Za obarvený text
Textový zápis ESC[01;31m + ESC[K ESC[m + ESC[K
Hexadecimální zápis 1b 5b 30 31 3b 33 31 6d + 1b 5b 4b 1b 5b 6d + 1b 5b 4b

Hodnota ESC odpovídá char c = '\033';.

Příklad C1

Obsah vstupního souboru Řetězec PATTERN Očekávaný výstup Očekávaný výstup (hexdump -C)
Hello, hello
Bye
el
Hello, hello
00000000  48 1b 5b 30 31 3b 33 31  6d 1b 5b 4b 65 6c 1b 5b  |H.[01;31m.[Kel.[|
00000010  6d 1b 5b 4b 6c 6f 2c 20  68 1b 5b 30 31 3b 33 31  |m.[Klo, h.[01;31|
00000020  6d 1b 5b 4b 65 6c 1b 5b  6d 1b 5b 4b 6c 6f 0a     |m.[Kel.[m.[Klo.|
0000002f

Odevzdání

Povinné zadání Volitelné zadání
Název v BRUTE HW5
Odevzdávané soubory grep.c
Argumenty při spuštění žádné –color=always -E
Kompilace pomocí clang -pedantic -Wall -Werror -std=c99
Očekávaná časová složitost 1) $\mathcal{O}(n)$ $\mathcal{O}(n^2)$ 2)

Zdroje

Použitá RNA SARS-CoV-2 Wuhan-Hu-1 byla nalezena na stránkách National Center for Biotechnology Information (NCIB).

1)
Kde $n$ je velikost vstupního souboru.
2)
Složitost je dána použitím reulárních výrazů, jinak $\mathcal{O}(n)$.
courses/bab36prga/hw/hw5.txt · Last modified: 2024/02/12 14:04 by faiglj