Shell Prakticky
Textové transformace příkazem awk

Lukáš Bařinka

Cíl

Cílem je vyzkoušet si textové úpravy pomocí filtru awk

Obsah

  • Jednoduché transformace pomocí příkazu awk
  • Složitější transformace pomocí příkazu awk

Část 1

Jednoduché transformace pomocí příkazu awk

Úloha 01

Pokud máte naklonovaný repozitář
https://gitlab.fit.cvut.cz/barinkl/uos-workbench.git, aktualizujte jej, jinak si jej naklonujte.


							~( cd ~/uos-workbench && git pull ) \
							|| git clone https://gitlab.fit.cvut.cz/barinkl/uos-workbench.git
						

Úloha 02

Do proměnné passwd uložte absolutní cestu k souboru passwd v adresáři uos-workbench . Zjistěte, zda soubor z této proměnné existuje.


							~passwd=~/uos-workbench/passwd
							~[ -f "$passwd" ] && echo OK
						

Úloha 03

Pomocí příkazu awk vypište počet řádků v souboru passwd.


							~awk 'END { print NR }' "$passwd"
						

Úloha 04

Vypište pouze 3. sloupec (UID) souboru passwd .


							~awk -F: '{ print $3 }' "$passwd"
						

Úloha 05

Jedním průchodem dat vypište nejvyšší UID ze souboru passwd .


							~awk -F: '$3 > max { max = $3 }; END { print max }' "$passwd"
						

Úloha 06

Jedním průchodem dat vypište uživatelské jméno uživatele s nejvyšším UID ze souboru passwd .


							~awk -F: '
							   $3 > max { max = $3; user = $1 }
							   END { print user }
							' "$passwd"
						

Úloha 07

Vypište reálné jméno všech uživatelů (5. sloupec) ze souboru passwd , které pomocí funkce tolower() převedete na malá písmena.


							~awk -F: '{ print tolower($5) }' "$passwd"
						

Úloha 08

Vypište původní jméno i jméno převedené na malá písmena, oddělte je pomocí ' -> ' .


							~awk -F: '{ print $5 " -> " tolower($5) }' "$passwd"

							~awk -F: '
							   BEGIN { OFS=" -> " }
							   { print $5, tolower($5) }
							' "$passwd"
						

Úloha 09

Vypište reálné jméno zaměstnanců (na konci reálného jména je slovo zam).


							~awk -F: '$5 ~ / zam$/ { print $5 }' "$passwd"
						

Úloha 10

Do výstupu předchozího příkladu přidejte na začátek řádky uživatelské jméno (1. sloupec) a reálné jméno převeďte na malá písmena.


							~awk -F: '$5 ~ / zam$/ { print $1, tolower($5) }' "$passwd"
						

Úloha 11

Z výstupu předchozího příkladu vypište pouze uživatelské jméno a příjmení uživatele.


							~awk -F: '$5 ~ / zam$/ { print $1, tolower($5) }' "$passwd" \
							| awk '{ print $1, $3 }'
						

Část 2

Složitější transformace pomocí příkazu awk

Úloha 12

Vypište prvních 5 znaků z uživatelského jména a z příjmení pomocí funkce substr() .

Předpokládejte, že příjmení je 2. slovo v reálném jméně uživatele.


							~awk -F'[: ]' '{ print substr($1,1,5), substr($6,1,5) }' "$passwd"
						

Úloha 13

Vypište prvních 5 znaků z uživatelského jména a příjmení, které převedete na malá písmena.


							~awk -F'[: ]' '
							   { print substr($1,1,5), tolower(substr($6,1,5)) }
							' "$passwd"
						

Úloha 14

V předchozí úloze zjistěte, zda začátek příjmení odpovídá začátku uživatelského jména. Pokud ne, vypište daný řádek.


							~awk -F'[: ]' '
							   substr($1,1,5) != tolower(substr($6,1,5))
							' "$passwd"
						

Úloha 15

Vypište celé reálné jméno a z něj odstraňte poslední slovo a přidejte na začátek řádky informaci o počtu slov ve jméně.


							~awk -F: '{ print $5 }' "$passwd" | awk '{ $NF=""; print NF, $0 }'

							~awk -F: '{ print $5 }' "$passwd" | awk 'NF > 0 { NF--; print NF, $0 }'
						

Úloha 16

Vypište reálné jméno uživatele (bez posledního slova), které je nejdelší nebo má nejvíce slov.

Použijte funkci length() .


							~awk -F: '{ print $5 }' "$passwd" \
							| awk 'NF > 0 { NF--; print }' \
							| awk '
							   length($0) > l  { l = length($0); L = "" }
							  length($0) == l  { L = L "\n" $0 }
							           NF > n  { n = NF; N = "" }
							          NF == n  { N = N "\n" $0 }
							              END  { print l, L; print n, N }
							'
						

Úloha 17

Spočítejte průměrnou délku reálného jména uživatele.


							awk -F: '{ l += length($5) }; END { print l/NR }' "$passwd"