Kapitola 64. Zpracování textů

Odkazy:

UNIX vznikl původně pro potřebu patentového oddělení firmy AT&T, pro zpracování textů. Tomu odpovídá velké množství nástrojů pro tento druh práce. Základním nástrojem je shell a jeho schopnost vatvářet kolony příkazů. To umožňuje průběžné zpracování textu kdy každý program v koloně jako stroj na běžícím pásu provede svoji operaci s textem a výsledek pošle ke zpracování následujícímu programu.

$ dpkg -L coreutils

Krátký přehled některých programů pro zpracování textu

cat, tac

Příkaz cat je určen pro čtení textu ze souboru. Je to filtr který neprovádí vůbec nic, tedy to co přečte na vstupu pošle beze změny na výstup. Umožňuje nám ovšem spojovat soubory. Uvedeme-li jako parametr seznam souborů jsou tyto postupně poslány na standardní výstup.

$ cat soubor1 soubor2 soubor3 > vysledek

Příkaz tac funguje velmi podobně s tím rozdílem že soubor čte řádek po řádku od konce. Obrátí tedy pořadí řádků.

$ tac
první řádek
druhý řádek
třetí řádek Ctrl+D
třetí řádek
druhý řádek
první řádek
wc
Spočte písmena, slova a řádky ve vstupním souboru.
tr

Provádí jednoduchý překlad/transformaci při které umožňuje nahrazovat znaky. Nahrazuje znaky 1 ku jedné. Například následujícíc zápis provede změnu všech malých znaků za velké.

$ tr 'a-z' 'A-Z'
sed
Proudový editor. Jedná se o obdobu editoru ed určenou pro použití v koloně příkazů pro automatickou editaci textu.
head, tail
Tyto dva příkazy pouští na výstup část vstupu podle parametrů. V základním použítí pouští head uvedený počet řádků od začátku zatímco tail od konce. Se sofistikovanějším nastavením můžeme dosáhnout takových efektů jako je výstup všech řádků mimo prvních 8 a podobně.
sort

How do I sort a file in place using bash shell?

Setřídí řádky na vstupu podle zadaného kritéria. Kritériem je určení podle které části řádku se má třídit. Zdali se má třídit číselně či abecedně a také můžeme třídit obráceně. Program má řadu parametrů ze kterých bych připoměl -n jenž třídí čísleně, takže 1 se řadí před 10.

Při třídění je třeba mít v patrnosti jaké je nastavné prostředí. Pokud se nám řadí číslice až za písmena, mám čské prostředí. Chceme-li číslice před písmeny, tedy pořadí (00, 01, 0A) stačí nastavit proměnnou LANG

$ LANG=C sort soubor
tee

Tee podle písmene 'T' slouží jako odbočka v koloně příkazů. Funguje tak že co je na vstupu pošle na výstup stejně jako příkaz cat ale navíc to ještě zapíše do souboru.

$ …|tee meziprodukt|…
split
Rozdělení souboru na menší. Či zápis vstupního proudu do více menších souborů. Zamýšlené použití bylo rozdělit velký soubor na menší například pro potřeby transportu na malých médiích.
cut
Remove sections from each line of files. Print selected parts of lines from each file to standard output.
ptx
Produce a permuted index of file contents. Output a permuted index, including context, of the words in the input files.
uniq
nl
Očísluje všechny řádky. Tedy na výstup pošle co je na vstupu a na začátek každého řádku přidá jeho pořadové číslo. Program má hodně voleb které dovolují například číslovat jen část řádků a mnohé další.
fold

Zalamování dlouhých řádků v souboru. Toto je jednoduchý nástroj, který rozdělí všechny dlouhé řádky podle zadaných kriterií. Jsou to maximální délka (-w 24) rozdělovat jen v mezeře mezi slovy (-s).

Varování

Nesrovná se s češtinou v UTF-8 kódování.

comm, diff
Porovnání dvou souborů.
cksum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum
join
paste

Lesser-known Linux commands: join, paste, and sort

csplit
expand, unexpand
fmt
Simple optimel text formater. Reformat each paragraph in files.
pr
Convert text files for printing. Paginate or columnate files for printing.
pv

http://www.ibm.com/developerworks/aix/library/au-spunix_pipeviewer/?S_TACT=105AGY20&S_CMP=HP

Pipe Viewer je program který měří informace protékající rourou a umožnuje zobrazovat jejich aktuální hodnoty. Dovede například vytvářet teploměry ukazující stav rozpracovanosti.

bfr

bfr(1) - Linux man page

unbuffer

Turn off buffering in pipe

Nejsilnější stránkou je možnost kombinovat příkazy do kolon. Můžeme například očíslovat řádky ve zdrojovém souboru, zalomit aby se vešly na stránku (na šířku stránky či sloupce) a hotové umístnit třeba ve dvou sloupcích na papír s tím že máme ještě očíslované stránky.

$ cat source.c| nl | fold -w64 | pr -2 -w136 >k-tisku

Velmi jednoduché dvousloupcové sazby textu dosáhneme například takto:

$ cat text| fmt -w 24 | pr -2 -w 52

Z mých pokusů jsem si všiml že český text kódovaný v utf-8 se neformátuje správně. V první chvíli jsem to obešel překódováním do jiného kódování které nepoužívá vícebytové kódování.

$ LANG=cs_CZ recode utf8..l2 <text|fmt -w25|pr -2 -w54|recode l2..utf8

Ale pro správný provoz to bude vyžadovat jěště nějaké vyladění.