Portál AbcLinuxu, 20. května 2024 03:03

Filtrujme čtivé texty z Projektu Gutenberg 4

13. 4. 2016 | Karel Kulhavý
Články - Filtrujme čtivé texty z Projektu Gutenberg 4  

V minulém díle jsem jako ukázkový problém při použití jednoduchého unixového příkazu na vystřižení sedmého sloupce uvedl, že nebude fungovat správně. Budeme analyzovat, jak takový problém při použití vzniká.

Mezery i tabulátory se zobrazují na obrazovce stejně, ale pro příkaz cut mají odlišný význam. Tato nehomogenita se dá ale snadno homogenizovat příkazem, který jednotlivé i opakující se mezery, tabulátory či jejich kombinace převálcuje na jednu mezeru. Přepínač -s říká, aby se komprimovaly opakující se sekvence znaků, očividně to funguje i na směsi znaků z první množiny, a současně s přepínačem -s lze použít funkci překladu na znak jiný. Obrácené lomítko a písmeno t znamená tabulátor. U příkazu tr a dalších příkazů to funguje, u jiných příkazů to ale fungovat zase nemusí.

tr -s '\t ' ' ' < filelist.txt > clean.txt

Vzniklý soubor clean.txt pak vypadá takto:

9574820 4504 -rw-rw-r-- 1 clock clock 4608764 Mar 15 2015 pg/etext96/pgwfh04.txt
9574857 4216 -rw-rw-r-- 1 clock clock 4315118 Mar 15 2015 pg/etext96/plivs10.txt
9574841 584 -rw-rw-r-- 1 clock clock 597079 Mar 17 2015 pg/etext96/bti1210.txt
9574842 4 -rw-rw-r-- 1 clock clock 274 Mar 17 2015 pg/etext96/sgcwp22.txt
9574873 216 -rw-rw-r-- 1 clock clock 220594 Mar 17 2015 pg/etext96/nvoyg10.txt
9574834 504 -rw-rw-r-- 1 clock clock 512351 Mar 17 2015 pg/etext96/psrev10.txt
9574821 616 -rw-rw-r-- 1 clock clock 629627 Mar 17 2015 pg/etext96/rlsl210.txt
9574878 340 -rw-rw-r-- 1 clock clock 346597 Mar 17 2015 pg/etext96/slanr10.txt
9574827 180 -rw-rw-r-- 1 clock clock 183018 Mar 17 2015 pg/etext96/batlf10.txt
9574853 4 -rw-rw-r-- 1 clock clock 80 Mar 17 2015 pg/etext96/notun3-readme.txt
9574874 324 -rw-rw-r-- 1 clock clock 328835 Mar 17 2015 pg/etext96/britm10a.txt
9574846 60 -rw-rw-r-- 1 clock clock 60059 Mar 17 2015 pg/etext96/thoml10.txt
9574844 420 -rw-rw-r-- 1 clock clock 427785 Mar 17 2015 pg/etext96/shabr10.txt
[…]

Ale ani to nám nepomůže. Co je tedy mysteriózní faktor způsobující selhání příkazu cut? Protože už vím, co hledat, odhalím problém následujícím příkazem grep:

grep -C 5 "^ " clean.txt|less | head -n 10

30286664 28 -rw-rw-r-- 1 clock clock 27498 Mar 17 2015 pg/4/8/2/1/48215/48215-0.txt
30286668 64 -rw-rw-r-- 1 clock clock 63695 Mar 17 2015 pg/4/8/2/1/48210/48210-0.txt
30286658 208 -rw-rw-r-- 1 clock clock 210832 Mar 17 2015 pg/4/8/2/1/48217/48217-0.txt
30286656 708 -rw-rw-r-- 1 clock clock 722131 Mar 17 2015 pg/4/8/2/1/48212/48212-0.txt
30286645 448 -rw-rw-r-- 1 clock clock 456771 Mar 17 2015 pg/4/8/2/1/48219/48219-0.txt
 224 1172 -rw-rw-r-- 1 clock clock 1197270 Mar 15 2015 pg/4/8/4/2/48426/48426-0.txt
 218 92 -rw-rw-r-- 1 clock clock 91485 Mar 17 2015 pg/4/8/4/2/48420/48420.txt
 213 584 -rw-rw-r-- 1 clock clock 596145 Mar 17 2015 pg/4/8/4/2/48429/48429.txt
 209 52 -rw-rw-r-- 1 clock clock 51657 Mar 17 2015 pg/4/8/4/2/48427/48427.txt
 203 256 -rw-rw-r-- 1 clock clock 261631 Mar 17 2015 pg/4/8/4/2/48425/48425-0.txt

Některé řádky totiž začínají mezerami! Kdybyste tohle ukázali sekretářce a zeptali se jí, co je v prvním sloupci, jsem přesvědčen že by řekla že 224, ale příkaz cut bude trvat na tom, že první sloupec je u takových řádků prázdný! Takže se sloupce rozsynchronizují a do výstupu půjdou u některých řádků data ze špatného sloupce – textový řetězec clock. Ten text se objevil, a to je důvod, proč se na chybu přišlo. Pokud by ale sousedící sloupec byl číselný, na chybu se vůbec přijít nemuselo a mohla zcela tiše vzniknout špatná data o rozložení velikostí souborů.

Čím je problém způsoben a jak mu předejít? Tím, že bylo nahlédnuto na malý vzorek dat a z toho učiněn závěr o formátu celého souboru, což je takzvané logické non sequitur. Logicky korektní řešení by bylo přečíst si všech 55 tisíc řádků a z toho teprv vyvodit závěr. Co je ale logicky korektní nemusí být praktické z hlediska spotřebovaného pracovního času potřebného na osobní prohlédnutí 55 tisíc řádků. Další možnost by bylo jakési formální odvození na základě speficikací chování příkazů z manuálových stránek, které jsou ovšem často nejednoznačné a možná i někdy špatně, k odvození, že příkaz někdy generuje mezery na začátku řádku by bylo možná třeba hloubková analýza ve větším počtu úrovní odkazů, a je stále riziko logické chyby při uvažování. Další možnosti řešení tohoto chybného uvažování, žádnou z nich ale elegantní, si uvedeme v dalším díle seriálu.

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

Diskuse k tomuto článku

13.4.2016 11:01 koroptev
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Odpovědět | Sbalit | Link | Blokovat | Admin
Tohle je metatrolling vlastni meducinou jakej ty zaprdli ideologove a nactilety hurafreetardpicusci jeste nezazili. Bojim se, ze je to na ne prilis sofistikovane az artove pojeti, ze message nedorazi. Tleskam ale uprimne.
Marián Kyral avatar 13.4.2016 19:58 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Náhodou to je docela napínavá detektivka :-D
14.4.2016 11:02 B
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Tohle je spíš melodrama typu Dallas, Esmeralda a podobně. V podstatě jde o hovno, hlavní je, že se z toho udělají stovky dílů. Posledně to byla o autech a sporácích, dneska je to o sekretářce. Kdyby nám soudruzi nezakázali hazard, tak se můžeme sázet co bude příště.
14.4.2016 11:05 B
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Posledně to bylo ...
13.4.2016 14:08 Roman
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Odpovědět | Sbalit | Link | Blokovat | Admin
WTF? :-)
Petr Tomášek avatar 13.4.2016 20:19 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Odpovědět | Sbalit | Link | Blokovat | Admin
Hele, Clocku, nechceš se raději podívat na ten blog o Optaru místo psaní takovýchto trivialit? Zdá se, že by se detekce chyb v Optaru měla vylepšit....
multicult.fm | monokultura je zlo | welcome refugees!
13.4.2016 20:23 Vlado
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Odpovědět | Sbalit | Link | Blokovat | Admin
Tato seria clankov sa dokulha k veci az niekedy v 1235-om pokracovani. Nema zmysel ju sledovat.
Saljack avatar 14.4.2016 15:53 Saljack | skóre: 28 | blog: Saljack | Praha
Rozbalit Rozbalit vše Re: Filtrujme čtivé texty z Projektu Gutenberg 4
Odpovědět | Sbalit | Link | Blokovat | Admin
Kde jsou ty doby co tu byl clanek kazdy den. Tohle neni snad ani na zpravicku.
Sex, Drugs & Rock´n Roll.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.