V predchádzajúcej časti sme si ukázali, ako na výpis obsahu súborov. Samozrejme sú možné aj ďalšie operácie so súbormi.
Základné, ale aj komplikovanejšie úpravy obsahu súboru umožňuje táto časť nástrojov balíka GNU Coreutils:
tr
Zámena, redukcia a mazanie znakov – to je doména nástroja tr
(skrátene translate, čiže preložiť). Takto napríklad zameníme malé znaky (tibor) za veľké (TIBOR):
echo tibor | tr '[:lower:]' '[:upper:]'
tr '[:lower:]' '[:upper:]' < subor.txt
Nástroj tr
teda znaky, ktoré mu pošleme (echo tibor
), prefiltruje cez nastavené pravidlá (tr '[:lower:]' '[:upper:]'
). Najskôr definujeme ktoré znaky sa majú zameniť ('[:lower:]'
), a potom ktorými znakmi sa predošlé znaky majú zameniť ('[:upper:]'
).
Okrem tried lower (malé znaky) a upper (veľké znaky) je možné použiť aj tieto iné triedy:
- alpha – písmená (
echo tibor | tr '[:alpha:]' 'p'
) - digits – čísla (
echo 12345 | tr '[:digits:]' 'c'
) - alnum – písmená a čísla (
echo tibor12345 | tr '[:alnum:]' 'pc'
) - blank – horizontálna medzera (
echo “tibor 12345” | tr '[:blank:]' 'hm'
) - space – horizontálna a vertikálna medzera (
echo “tibor 12345” | tr '[:blank:]' 'hvm'
)
Máme tiež možnosť pracovať s netlačiteľnými znakmi ako:
- \n – nový riadok (
echo “tibor\n12345” | tr '\n' ';'
) - \t – tabulátor (
echo “tibor\t12345” | tr '\t' ';'
)
Jednoduchšia forma zámeny znakov je mazanie. Vtedy iba určíme, že chcem použiť režim mazania (-d
) a zadáme, ktoré znaky potrebujeme vymazať ('\n'
):
echo “tibor\n12345” | tr -d '\n'
Podobne ako pri mazaní aj pri redukcii iba zadefinujeme režim (-s
) a znaky na zredukovanie. Napríklad takto zariadime, aby sa neopakovali rovnaké po sebe nasledujúce písmená:
echo “tiiibooor” | tr -s '[:alpha:]'
Zároveň však k redukcii môžeme pridať aj zámenu znakov takto:
echo “tiiibooor” | tr -s '[:alpha:]' '[:upper:]'
(un)expand
Ak ide o zmenu tabulátorov (\t
) na medzery a naopak v každom riadku (\n
), použijeme nástroje expand (tabulátor > medzera) a unexpand (medzera > tabulátor).
Keby sme napríklad spustili tento príkaz, zistili by sme, že každý tabulátor sa zmenil na taký počet medzier, po ktorom budú slová v oboch riadkoch zarovnané presne pod sebou:
printf 'jablká\thrušky\tbanány\nzdravé\tchutné\tsladké\n' | expand
Naopak, keby sme sa rozhodli použiť namiesto tabulátorov (\t
) medzery (dve a viac) a chceli by sme ich zmeniť na tabulátory, použijeme unexpand takto:
printf 'jablká hrušky banány\nzdravé chutné sladké\n' | unexpand
cut
Nástroj cut
robí presne to, čo znamená jeho názov – vyreže (cut = rezať) požadovaný stĺpec alebo viacero stĺpcov z tabuľky. Takto napríklad necháme vypísať iba druhý stĺpec (čiže hrušky v prvom riadku a chutné v druhom riadku):
printf 'jablká\thrušky\tbanány\nzdravé\tchutné\tsladké\n' | cut -f2
Naopak, takto vynecháme druhá stĺpec a vypíšeme prvý a tretí:
printf 'jablká\thrušky\tbanány\nzdravé\tchutné\tsladké\n' | cut -f1,3
Ak namiesto čiarky zadáme spojovník, vypíšeme všetky stĺpce od prvého až po tretí:
printf 'jablká\thrušky\tbanány\nzdravé\tchutné\tsladké\n' | cut -f1-3
Od druhého stĺpca až po koniec to bude vyzerať takto:
printf 'jablká\thrušky\tbanány\nzdravé\tchutné\tsladké\n' | cut -f2-
A ešte od druhého stĺpca po prvý:
printf 'jablká\thrušky\tbanány\nzdravé\tchutné\tsladké\n' | cut -f-2
Ak sú údaje oddelené iným znakom ako tabulátor (\t
), musíme to nástroju cut povedať prepínačom -d
takto:
printf 'jablká;hrušky;banány\nzdravé;chutné;sladké\n' | cut -d';' -f2
Nakoniec si ešte môžeme zmeniť oddeľovač vo výstupe pomocou prepínača --output-delimiter
takto:
printf 'jablká;hrušky;banány\nzdravé;chutné;sladké\n' | cut --output-delimiter=, -d';' -f1,2
paste
Povedzme, že vyššie používaný príklad si rozdelíme do dvoch súborov takto:
printf 'jablká\nhuršky\nbanány' > ovocie.txt
printf 'zdravé\nchutné\nsladké' > vlastnosti.txt
Vďaka nástroju paste tieto dva súbory môžeme spojiť do jedného, pričom stĺpce sa umiestnia vedľa seba takto:
paste ovocie.txt vlastnosti.txt
Oddeľovací znak bude tabulátor, čo však môžeme zmeniť prepínačom -d
takto:
paste -d',' ovocie.txt vlastnosti.txt
Výsledok môžeme nakoniec nechať zapísať do súboru:
paste -d',' ovocie.txt vlastnosti.txt > ovocie_vlastnosti.txt
join
Ostávame pri spájaní stĺpcov z rôznych súborov do jednej tabuľky. Tentokrát však vyberieme len tie stĺpce, ktoré majú spoločný prvý stĺpec. Vytvoríme si jednoduchý záznam o nákupe ovocia:
printf 'jablká\t10\nbanány\t5\nhrušky\t7' > ovocie_1.txt
printf 'jablká\t12\nbanány\t8\nhrušky\t5' > ovocie_2.txt
Keďže oba súbory začínajú rovnakým stĺpcom, nástroj join je schopný priradiť číselné hodnoty ku jednotlivým druhom ovocia takto:
join ovocie_1.txt ovocie_2.txt
Zhrnutie
V tejto časti sme opäť predstavili pomerne jednoduché nástroja z balíka GNU Coreutils. Tentokrát išlo o operácie so znakmi, riadkami a tiež s celými stĺpcami. Kombináciou týchto nástrojov môžeme vytvoriť skript, ktorý komplexne upraví obsah súboru podľa detailne špecifikovaných kritérií.