1. Báza znalostí
  2. Cloud a servery
  3. Nástroje
  4. GNU Coreutils – operácie so znakmi

GNU Coreutils – operácie so znakmi

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.

Tip: Všetky príkazy si jednoducho otestujte s WebSupport VPS. Vyskúšajte prémiový virtuálny server zdarma ešte dnes.

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í.

Aktualizované 19. júla 2022

Bol pre vás tento návod nápomocný?

Mohlo by vás tiež zaujímať:

Spýtajte sa nás, radi poradíme
Po - Ne 8:00-22:00
Kontaktovať podporu