Skip to content

Latest commit

 

History

History
623 lines (441 loc) · 33.6 KB

zpracování-textových-souborů.md

File metadata and controls

623 lines (441 loc) · 33.6 KB

Zpracování textových souborů

!Štítky: {tematický okruh}{zpracování textu} !OblíbenáZaklínadla: !ÚzkýRežim: zap

Úvod

Tato kapitola se zabývá nástroji pro řazení, filtrování, analýzu, konverzi a jiné zpracování textových souborů. Nezabývá se však komplexními nástroji jako GNU awk, sed či Perl, kterým budou věnovány samostatné kapitoly.

Textové soubory se vyznačují tím, že jsou tvořeny posloupností řádek (v této kapitole zvaných „záznamy“) tvořených řetězci znaků z tzv. znakové sady. V souboru jsou znaky uloženy ve formě jednobajtových či vícebajtových sekvencí, jejichž význam určuje použité kódování znaků (v dnešní praxi téměř výhradně UTF-8 nebo jeho podmnožina ASCII).

Většina nástrojů používaných v této kapitole je vyvíjena v rámci projektu GNU.

Definice

  • Kódování znaků (character encoding) je určitá reprezentace znakové sady textu pomocí bajtů a jejich sekvencí v souboru či paměti. U textových souborů uvažujeme výhradně kódování UTF-8, případně jeho podmnožinu ASCII. Soubory v jiných kódováních sice také můžeme zpracovávat, ale obvykle je výhodnější je nejprve převést na UTF-8.
  • Znak (character) je základní jednotka textu, které je kódováním znaků přiřazen nějaký význam a binární reprezentace. Např. „A“ je v UTF-8 znak, který znamená písmeno A a je reprezentován bajtem o hodnotě 65. „\n“ je v UTF-8 znak, který znamená konec řádku a je reprezentován bajtem o hodnotě 10.
  • Řetězec (string) je libovolná posloupnost znaků, i prázdná či tvořená jedním znakem.
  • Záznam je zobecnění pojmu „řádka“ v textovém souboru. Textový soubor se dělí na jednotlivé záznamy podle jejich zakončení ukončovačem záznamu (record separator), což je typicky znak konce řádky „\n“ nebo nulový bajt „\0“. Záznamy se číslují od 1.
  • Záznam může být brán jako celek, nebo může být dál dělen na sloupce (fields). Existuje několik metod dělení záznamu na sloupce, nejčastější je použití určitého znaku ASCII jako „oddělovače sloupců“ (field separator). Sloupce se v každém záznamu číslují od 1.
  • Záplata je speciální textový soubor, který obsahuje záznam o změnách mezi dvěma verzemi jednoho nebo více textových souborů. Využití záplat je v dnešní době zřídkavé.

V této kapitole rozlišuji následující formáty textových souborů:

  • TXT – záznamy ukončeny „\n“, na sloupce se nedělí.
  • TXTZ – záznamy ukončeny „\0“, na sloupce se nedělí.
  • TSV – záznamy ukončeny „\n“, sloupce se dělí tabulátorem („\t“) nebo jiným znakem ASCII (např. v /etc/passwd se dělí znakem „:“).
  • TSVZ – záznamy ukončeny „\0“, sloupce se oddělují tabulátorem („\t“) nebo jiným znakem ASCII.
  • pevná šířka sloupců – záznamy ukončeny „\n“, sloupce (kromě posledního) jsou zarovnány na pevný počet znaků pomocí mezer.

!ÚzkýRežim: vyp

Zaklínadla: Konverze

Konverze ukončení řádky

# Windows nebo linux na linux (na místě/rourou)
sed -Ei 's/\r//g' {soubor}...
{...} | tr -d \\r | {...}

# Windows nebo linux na Windows (na místě/rourou)
sed -Ei 's/\r*$/\r/' {soubor}...
{...} | sed -E 's/\r*$/\r/' | {...}

# Mac OS na linux (na místě/rourou)
LC_ALL=C sed -zEi 'y/\\r/\\n/' {soubor}...
{...} | tr \\r \\n | {...}

# linux na Mac OS (na místě/rourou)
LC_ALL=C sed -zEi 'y/\\n/\\r/' {soubor}...
{...} | tr \\n \\r | {...}

Konverze kódování znaků

# konvertovat soubor do/z UTF-8
// Užitečná kódování: ISO8859-2, WINDOWS-1250, UTF-16, UTF-16BE, UTF-16LE, UTF-8, CP852 (MS-DOS), MAC-CENTRALEUROPE.
iconv -f "{vstupní kódování}" -t UTF-8 [-o "{výstupní-soubor}"] [{vstupní-soubor}]...
iconv -f UTF-8 -t "{cílové kódování}[//IGNORE]" [-o "{výstupní-soubor}"] [{vstupní-soubor}]...

# konvertovat soubor do ASCII s transliterací
// Poznámka: tato konverze je ztrátová, a tudíž prakticky jednosměrná.
iconv -f "{vstupní kodování}" -t "ASCII//TRANSLIT" [-o "{výstupní-soubor}"] [{vstupní-soubor}]...

# vypsat úplný seznam podporovaných kódování
iconv -l | sed -E 's!/*$!!'

# pokusit se zjistit kódování textu
// Tip: přibližně může pomoci příkaz „file“ nebo autodetekce kódování při otevření textového souboru ve Firefoxu.
?

Konverze velikosti písmen

# konvertovat malá písmena na velká (obecně/příklad)
sed -E 's/.*/\U&/' [{vstupní-soubor}]...
printf "Žluťoučký kůň\n" | sed -E's/.*/\U&/' ⊨ ŽLUŤOUČKÝ KŮŇ

# konvertovat velká písmena na malá (obecně/příklad)
sed -E 's/.*/\L&/' [{vstupní-soubor}]...
printf "Žluťoučký kůň\n" | sed -E's/.*/\L&/' ⊨ žluťoučký kůň

# konvertovat malá písmena na velká a naopak
sed -E 's/./0&/g;s/0([[:lower:]])/1\U\1/g;s/0[[:upper:]]/\L&/g;s/[01](.)/\1/g' [{vstupní-soubor}]...
sed -E 's/(.)/0\1/g;s/0([[:lower:]])/1\U\1/g;s/0([[:upper:]])/1\L\1/g;s/[01](.)/\1/g [{vstupní-soubor}]...

Zaklínadla: Práce se záznamy

Důležitá poznámka pro všechna zaklínadla v této sekci: Kde je v zaklínadle volitelný parametr „z“ (resp. „-z“), tento parametr funguje jako přepínač mezi formáty txt a txtz. Při použití formátu txt tento přepínač vynechejte, při použití txtz ho naopak vždy zařaďte.

Vytvoření a smazání

# vytvořit prázdný soubor (existuje-li, vyprázdnit)
> {soubor} [> {další-soubor}]...

# vytvořit prázdný soubor (existuje-li, jen aktualizovat čas „změněno“)
touch {soubor}...

# N-krát zopakovat určitý záznam (txt/txtz)
// Výchozí hodnota textu záznamu je „y“.
yes [[--] {text-záznamu}] | head -n {N}
printf %s\0 $'{text-záznamu}' | sed -z ':x;p;b␣x' | head -zn {N}

Filtrace záznamů podle pořadí

# vzít/vynechat N prvních
head -[z]n {N} [{soubor}]...
tail -[z]n +{N+1} [{soubor}]...

# vzít/vynechat N posledních
tail -[z]n {N} [{soubor}]...
head -[z]n -{N} [{soubor}]...

# vzít/vynechat konkrétní záznam
sed -[z]n {číslo-záznamu}p [{soubor}]...
sed [-z] {číslo-záznamu}d [{soubor}]...

# vzít/vynechat rozsah záznamů
sed -[z]n {první-ponechaný},{poslední-ponechaný}p [{soubor}]...
sed [-z] {první-vynechaný},{poslední-vynechaný}d [{soubor}]

# vzít pouze liché/sudé záznamy
sed -[z]n 'p;n' [{soubor}]...
sed -[z]n 'n;p' [{soubor}]...

Filtrace záznamů podle obsahu

# vzít/vynechat záznamy odpovídající regulárnímu výrazu
egrep [-z] [-x] [{parametry}] [--] {regulární-výraz} [{soubor}]...
egrep [-z] -v [-x] [{parametry}] [--] {regulární-výraz} [{soubor}]...

# vzít/vynechat záznamy obsahující podřetězec
// Poznámka: V hledaném podřetězci se nesmí vyskytovat znak \n, a to ani u formátu txtz, protože fgrep tento znak používá k oddělení více různých hledaných podřetězců. Pokud váš podřetězec tento znak obsahuje, existuje několik řešení, nejjednodušším je pomocí příkazu „tr“ na vstupu i výstupu příkazu fgrep prohodit znak \n s jiným ASCII znakem, který se v hledaném podřetězci nevyskytuje.
fgrep [-z] [--] '{podřetězec}' [{soubor}]...
fgrep [-z] -v [--] '{podřetězec}' [{soubor}]...

# vzít/vynechat záznamy shodné s řetězcem
fgrep -[z]x [--] '{řetězec}' [{soubor}]...
fgrep -[z]xv [--] '{řetězec}' [{soubor}]...

# vzít/vynechat záznamy od prvního vyhovění regulárnímu výrazu
// Znaky „/“ v regulárním výrazu je nutno odzvláštnit zpětným lomítkem (popř. GNU sed umožňuje použít jiný oddělovač regulárního výrazu).
sed -[z]En '/{regulární výraz}/,$p' [{soubor}]...
sed -[z]E '/{regulární výraz}/,$d' [{soubor}]...

Filtrace záznamů podle počtu výskytů

# vybrat ty, které se vysktují pouze jednou
LC_ALL=C sort [-z] [{soubor}]... | LC_ALL=C uniq -[z]u

# vybrat ty, které se vyskytují více než jednou (duplicity); vypsat jeden na skupinu/všechny
LC_ALL=C sort [-z] [{soubor}]... | LC_ALL=C uniq -[z]d
LC_ALL=C sort [-z] [{soubor}]... | LC_ALL=C uniq -[z]D

# vybrat ty, které se vyskytují N-krát
LC_ALL=C sort [-z] [{soubor}]... | LC_ALL=C uniq -[z]c | sed -[z]E 's/^\s*{N}\s//;t;d'

# seřadit a vypsat počet výskytů (především pro člověka)
LC_ALL=C sort [-z] [{soubor}]... | LC_ALL=C uniq -[z]c | sort -[z]n[r]

Řazení a přeskládání záznamů

# obrátit pořadí (txt/txtz)
tac [{soubor}]...
tac -s \\0 [{soubor}]...

# náhodně přeskládat
shuf [-z] [{soubor}]

# seřadit
[LC_ALL=C][.UTF-8] sort [-z] [{parametry}] [{soubor}]...

# seřadit a vyloučit duplicity
[LC_ALL=C.UTF-8] sort -[z]u [{soubor}]...

# seskupit k sobě shodné záznamy a tyto skupiny náhodně přeskládat
sort -[z]R [{soubor}]...

# seřadit, s výjimkou prvních N záznamů (ty ponechat, jak jsou)
[cat {soubor}... |] (sed -[z]u {N}q; [LC_ALL=C] sort [-z] [{parametry}])

Množinové operace (nad seřazenými záznamy)

# předzpracování textového souboru pro množinové operace (vyžadované!)
LC_ALL=C sort -[z]u [{soubor}]

# množinové sjednocení (or)
LC_ALL=C sort -[z]mu {první-soubor} {další-soubor}...

# množinový průnik dvou souborů (and)
LC_ALL=C join [-z] -t "" -j 1 {první-soubor} {druhý-soubor}

# množinový rozdíl dvou souborů (and not)
LC_ALL=C join [-z] -t "" -j 1 -v 1 {hlavní-soubor} {odečítaný-soubor}

# exkluzivní sjednocení dvou souborů (xor)
LC_ALL=C join [-z] -t "" -j 1 -v 1 -v 2 {soubor1} {soubor2}

# množinový průnik více souborů (and)
// Tip: nejlepšího výkonu této varianty dosáhnete tak, že začnete od nejmenšího vstupního souboru.
cat {první-soubor} [| LC_ALL=C join [-z] -t "" -j 1 - {další-soubor}]...

Ostatní

# počet záznamů (txt/txtz)
wc -l < {soubor}
tr -cd \\0 < {soubor} | wc -c

# maximální délka záznamu (txt/txtz)
tr '\t' x < {soubor} | wc -L
tr '\0\n\t' '\nxx' < {soubor} | wc -L

# spojit soubory za sebe
// Standardní vstup můžete mezi soubory vřadit parametrem „-“ místo názvu souboru. Neprázdné soubory musejí být řádně ukončeny ukončovačem záznamu, jinak se poslední záznam spojí s prvním záznamem následujícího souboru.
cat {soubor}...

# rozdělit soubor na díly s uvedeným maximálním počtem záznamů (txt/txtz/příklad)
// Přípona výstupních souborů nesmí obsahovat oddělovač adresářů „/“. Číslování výstupních souborů začíná od nuly; jinou hodnotu lze nastavit, když místo parametru -d použijete parametr --numeric-suffixes=číslo. Uvedený příklad rozdělí soubor „vse.txt“ po sto řádcích na soubory „rozdelene-zaznamy/s00000dil.txt“, „rozdelene-zaznamy/s00001dil.txt“ atd.
split -d -a {počet-číslic} -l {maximální-počet-záznamů} [--additional-suffix='{přípona výstupních souborů}'] {vstupní-soubor} "{předpona výstupních souborů}"
split -d -a {počet-číslic} -l {maximální-počet-záznamů} -t \\0 [--additional-suffix='{přípona výstupních souborů}'] {vstupní-soubor} "{předpona výstupních souborů}"
split -d -a 5 -l 100 --additional-suffix='dil.txt' vse.txt "rozdelene-zaznamy/s"

# zapisovat na standardní výstup a současně do souborů
[{zdroj vstupu} |] tee [-a] {výstupní-soubor}...

# obrátit pořadí znaků v každém záznamu (txt/txtz)
rev [{soubor}]...
sed -zE 's/[^\n]/)&(/g;s/\n/)xx(/g' [{soubor}]... | tr \\0 \\n | rev | tr \\n \\0 | sed -zE 's/\(xx\)/\n/g;s/\((.)\)/\1/g'

# ke každému záznamu přidat předponu/příponu
// Příkaz „sed“ vyžaduje v příponě i předponě další úroveň odzvláštnění znaků „\“ a „\n“. Proto v uvedeném případě zadávejte zpětné lomítko jako „\\\\“ a konec řádky jako „\\\n“. Konec řádky se navíc může vyskytnout pouze při použití formátu txtz, u formátu txt pravděpodobně nebude fungovat správně.
sed [-z] $'i\\\n{předpona}' [{soubor}]... | paste [-z] -d "" - -
sed [-z] $'a\\\n{přípona}' [{soubor}]... | paste [-z] -d "" - -

# ke každému záznamu přidat předponu i příponu (alternativy)
// Uvedené varianty se liší požadavky na odzvláštnění v příponě: v první variantě sed požaduje dodatečné odzvláštění znaků „\“ a (případně) konce řádku; v druhé variantě požaduje sed odzvláštnění znaků „\“, „/“ a „&“.
sed [-z] $'i\\\n{předpona}\np\nc\\\n{přípona}' [{soubor}]... | paste [-z] -d "" - - -
sed [-z] 's/.*/{předpona}&{přípona}/'

# přidat číslo záznamu pro člověka (txt/txtz)
nl [{parametry}] {soubor}...
gawk 'BEGIN {RS=ORS="\0"; OFS="\t";}{printf("%7d %s\n", NR, $0)}' [--] [{soubor}]...

# přeformátovat text do řádek určité šířky
// Běžně se k tomu používá příkaz „fmt“, ale ten nerespektuje vícebajtové znaky, takže pro texty v UTF-8 funguje nekorektně.
?

Zaklínadla: Práce se sloupci (TSV, TSVZ)

Důležité poznámka pro všechna zaklínadla v této sekci: Kde je v zaklínadle volitelný parametr „z“ (resp. „-z“), tento parametr funguje jako přepínač mezi formáty tsv a tsvz. Při použití formátu tsv tento přepínač vynechejte, při použití tsvz ho naopak vždy zařaďte.

Vybrat/spojit sloupce

# vzít/vynechat určité sloupce
// Specifikace sloupců specifikuje množinu (tzn. ne výčet) sloupců. Má tvar jednotlivých čísel oddělených čárkami, např. „7,3,2,5,2“ vypíše sloupce 2, 3, 5 a 7. Místo jednotlivého čísla lze zadat rozsah ve tvaru „číslo-číslo“, „číslo-“ nebo „-číslo“, který se rozvine na všechny odpovídající sloupce, takže např. specifikace „7,3-5,-4“ odpovídá sloupcům 1, 2, 3, 4, 5 a 7.
cut [-z] [-d {oddělovač}] -f {specifikace,sloupců} [{soubor}]...
cut --complement [-z] [-d {oddělovač}] -f {specifikace,sloupců} [{soubor}]...

# vzít určité sloupce (bez omezení)
// Pro čtení ze standarního vstupu zadejte místo souboru „-“.
join [-z] --nocheck-order -j 1 -a 2 -t $'\t' -o 2.{číslo-prvního-sloupce}[,2.{číslo-dalšího-sloupce}]... /dev/null {soubor}

# spojit sloupce ze dvou či více souborů podle čísla záznamu
paste [-z] [-d {oddělovač}] {soubor1} {soubor2} [{další-soubor}]...

# spojit sloupce ze dvou souborů podle společného sloupce (komplikované)
// Chování příkazu „join“ je smysluplné, ale poměrně komplikované. Před použitím tohoto zaklínadla prosím nastudujte manuálovou stránku příkazu join!
[LC_ALL=C] join [-z] [{další parametry}] -t $'\t' -1 {číslo-sloupce-v-prvním-souboru} -2 {číslo-sloupce-v-druhém-souboru} [-a 1] [-a 2] [-o {definice-výstupu}] {soubor1} {soubor2}

Filtrace podle obsahu sloupců

Pro tsvz uveďte část „;RS=ORS="\0";“.

# vzít/vynechat záznamy, kde N-tý sloupec odpovídá regulárnímu výrazu
gawk 'BEGIN {FS=OFS="\t"[;RS=ORS="\0";]} ${N} **~ /{regulární výraz}/'** [{soubor}]...
gawk 'BEGIN {FS=OFS="\t"[;RS=ORS="\0";]} ${N} !~ /{regulární výraz}/' [{soubor}]...

# vzít/vynechat záznamy, kde N-tý sloupec obsahuje podřetězec
gawk 'BEGIN {FS=OFS="\t"[;RS=ORS="\0";]} index(${N}, "{podřetězec}")' [{soubor}]...
gawk 'BEGIN {FS=OFS="\t"[;RS=ORS="\0";]} !index(${N}, "{podřetězec}")' [{soubor}]...

# vzít/vynechat záznamy, kde N-tý sloupec je řetězec
gawk 'BEGIN {FS=OFS="\t"[;RS=ORS="\0";]} ${N}** == "{podřetězec}"'** [{soubor}]...
gawk 'BEGIN {FS=OFS="\t"[;RS=ORS="\0";]} ${N}** != "{podřetězec}"'** [{soubor}]...

Řazení záznamů podle obsahu sloupců

# seřadit podle N-tého sloupce
[LC_ALL=C.UTF-8] sort [-z] -t $'\t' -k {N},{N}[{druh-a-příznaky-řazení}] [{soubor}]...

# seřadit podle sloupců M až N (včetně)
[LC_ALL=C.UTF-8] sort [-z] -t $'\t' -k {M},{N}[{druh-a-příznaky-řazení}] [{soubor}]...

# seřadit podle více kritérií
[LC_ALL=C.UTF-8] sort [-z] [-s] -t $'\t' -k {jedno-kritérium} [-k {další-kritérium}]... [{soubor}]...

# příklad: seřadit vzestupně podle číselné hodnoty 7. sloupce a pak sestupně podle 3. sloupce, bez ohledu na velikost písmen
sort [-z] -t $'\t' -k 7,7n -k 3,3ri [{soubor}]...

Ostatní

Pro formát tsvz použijte „RS="\0";“, pro tsv jej vynechejte.

# počet sloupců prvního záznamu
head [-z] {soubor} | tr -cd \\t | wc -c

# maximální počet sloupců (tsv/tsvz)
gawk 'BEGIN {FS="\t"; [RS="\0";] r=0;} NR == 1 || NF > r {r = NF} END {print r}' [{soubor}]...

# minimální počet sloupců
// Poznámka: prázdný řádek se počítá jako 0 sloupců, proto pokud ho vstup obsahuje, výsledek bude 0.
gawk 'BEGIN {FS="\t"; [RS="\0";] r=0;} NR == 1 || NF < r {r = NF} END {print r}' [{soubor}]...

# naformátovat záznamy jako tabulku s pevnou šířkou sloupců (tsv/tsvz)
column -nt[e] -s $'\t' [{soubor}]...
[cat {soubor}... |] tr '\0\n' '\n␣' | column -n[e]t -s $'\t' | tr \\n \\0

# vložit sloupec s číslem záznamu před první sloupec
// Poznámka: zadáte-li víc souborů, počítadlo záznamů se nebude restartovat na začátku každého z nich.
gawk 'BEGIN { [RS = ORS = "\0";] OFS = "\t";} {print NR, $0}' [{soubor}]...

# vložit sloupec s číslem záznamu před N-tý sloupec, kde N není 1
gawk [-v 'RS=\0'] '{print gensub(/\t/, "\t" NR "\t", {N}** - 1);}'** [{soubor}]...

Zaklínadla: Práce se znaky a podřetězci

Náhrada

# náhrada podřetězce podle regulárního výrazu
// Pro podrobnější popis syntaxe vyhledejte kapitolu Sed!
sed -[z]E 's/{regulární výraz}/{řetězec náhrady}/[g]' [{soubor}]...

# transliterace (náhrada znaků podle tabulky)(obecně/příklad)
// Počet „původních“ a „náhradních“ znaků musí přesně odpovídat. Znaky „/“ a „\“ je v obou výčtech nutno odzvláštnit dalším zpětným lomítkem. Na místo znaku můžete použít i sekvenci „\0“, „\n“ apod. „Náhradní znaky“ se smí opakovat, „původní“ ne.
sed -[z]E 'y/{znak-původní}.../{znak-náhradní}/' [{soubor}]...
sed -E 'y/A\/B\\C/a|b|c/' test.txt

Vybrat/spojit sloupce

# vzít určité sloupce (obecně/příklad)
// Pro složitější případy je v GNU awk funkce „substr()“ nebo zvláštní režim pro zpracování souborů s pevnou šířkou sloupců.
gawk 'BEGIN{FS=OFS=""}{print ${číslo-sloupce}[,{další-číslo-sloupce}]...}' [{soubor}]...
gawk 'BEGIN{FS=OFS=""}{print $3, $5, $4, $7}' <<<'AŽČŠVŘů' ⊨ ČVŠů

# vynechat určité sloupce
colrm {první-vynechaný} [{poslední-vynechaný}] [< {soubor}]

# vynechat prvních/posledních deset znaků každé řádky
colrm 1 10
sed -E 's/.{,10}$//'

Filtrace podle obsahu sloupců

# vzít/vynechat záznamy, jejichž podřetězec na indexech M až N odpovídá regulárnímu výrazu
gawk '[BEGIN {RS=ORS="\0"}] substr($0, {M}, {N} - {M} + 1) ~ /{regulární výraz}/' [{soubor}]...
gawk '[BEGIN {RS=ORS="\0"}] substr($0, {M}, {N} - {M} + 1) !~ /{regulární výraz}/' [{soubor}]...

# vzít/vynechat záznamy, jejichž podřetězec na indexech M až N obsahuje podřetězec
gawk '[BEGIN {RS=ORS="\0"}] index(substr($0, {M}, {N} - {M} + 1), "{podřetězec}")' [{soubor}]...
gawk '[BEGIN {RS=ORS="\0"}] !index(substr($0, {M}, {N} - {M} + 1), "{podřetězec}")' [{soubor}]...

# vzít/vynechat záznamy, jejichž podřetězec na indexech M až N je daný řetězec
gawk '[BEGIN {RS=ORS="\0"}] substr($0, {M}, {N} - {M} + 1) == "{řetězec}"' [{soubor}]...
gawk '[BEGIN {RS=ORS="\0"}] substr($0, {M}, {N} - {M} + 1) != "{řetězec}"' [{soubor}]...

Řazení

# řadit podle znaků na indexech M až N (včetně)
[LC_ALL=C.UTF-8] sort [{další parametry}] -k 1.{M},1.{N}{parametry-řazení} [{soubor}]...

Zaklínadla: Záplatování

# vytvořit záplatu adresáře
// Aby záplata fungovala, označení starého a nového adresáře nesmějí obsahovat žádná lomítka, musejí to být jen holá jména podadresářů aktuálního adresáře.
diff -Nar -U 3 {starý-adresář} {nový-adresář} > {soubor.pdiff} || test $? -eq 1

# aplikovat záplatu adresáře
patch -N -p 1 -d {adresář} < {soubor.pdiff}

# vytvořit záplatu souboru
LC_ALL=C TZ=UTC diff -Na -U 3 {starý-soubor} {nový-soubor} > {soubor.pdiff} || test $? -eq 1

# aplikovat záplatu souboru
patch -NZ[t] {cílový-soubor} {soubor.pdiff}

Parametry příkazů

cut

*# *
cut {parametry} [{soubor}]...

!parametry:

  • ☐ -d {oddělovač} :: Nastaví oddělovač sloupců pro parametr -f; výchozí je "\t", což znamená tabulátor. Používejte pouze znaky ASCII.
  • ○ -f {sloupce} ○ -b {bajty} :: Definuje množinu sloupců či bajtů každého záznamu, které mají být propuštěny. Pozor, pořadí ani duplicity nemají vliv na výstup! Příklad specifikace: „7,13-15,-3,20-“
  • ☐ --complement :: Neguje definovanou množinu – vybrané sloupce či bajty vypustí a vezme zbytek.
  • ☐ -z :: Ukončovač záznamu je \0 místo \n.

join

*# *
[LC_ALL=C.UTF-8] join {parametry} {soubor1} {soubor2}

!parametry:

  • ○ -1 {sloupec} -2 {sloupec} ○ -j {sloupec-pro-oba} :: Určuje společný sloupec ve vstupních souborech.
  • ☐ -t {znak} :: Definuje oddělovač sloupců. Prázdný argument značí, že se soubory na sloupce nedělí.
  • ○ -a {1-nebo-2} ○ -v {1-nebo-2} :: Dovolí vypsání nespárovaných záznamů ze souboru 1 nebo 2. Varianta „-v“ navíc potlačí vypsání spárovaných záznamů.
  • ☐ -o {formát} :: Definuje pořadí sloupců na výstupu. Jednotlivé specifikace mohou mít tvar „0“ (společný sloupec), „1.{číslo}“ pro sloupec prvního souboru nebo „2.{číslo}“ pro sloupec druhého souboru. Specifikace se oddělují čárkami nebo mezerami. Příklad specifikace: „0,1.1,1.2,2.1,2.2,0“.
  • ☐ -z :: Ukončovač záznamu je \0 místo \n.
  • ○ --check-order ○ --nocheck-order :: Zapne, resp. vypne kontrolu uspořádání vstupního souboru.

paste

*# *
paste [{parametry}] [{soubor}]...

!parametry:

  • ☐ -d {oddělovače} :: Definuje znaky vkládané v místech spojení záznamů. Je-li předaný řetězec prázdný, použijí se prázdné řetězce, jinak se budou cyklicky používat jednotlivé znaky ze zadaného řetězce.
  • ☐ -z :: Ukončovač záznamu je \0 místo \n.
  • ☐ -s :: Ukončovače záznamu kromě posledního interpretuje jako oddělovače sloupců, tím pádem spojí všechny záznamy do jednoho.

sed

*# *
sed [{parametry-kromě-e-či-f}] {skript-sedu} [{soubor}]...
sed {parametry-včetně-e-či-f} [{soubor}]...

!parametry:

  • ☐ -E :: Použije rozšířené regulární výrazy místo základních (doporučuji vždy, když skript obsahuje regulární výraz).
  • ☐ -n :: Potlačí automatické vypsání „pracovní paměti“ po každém cyklu skriptu.
  • ☐ -z :: Ukončovač záznamu je \0 místo \n.
  • ○ -e {skript-sedu} ○ -f {soubor} :: Načte skript z parametru, resp. ze souboru; oba parametry lze kombinovat či použít opakovaně.
  • ☐ -u :: Načítá jen nezbytný počet bajtů a vypisuje na výstup co nejdřív.

sort

*# *
[LC_ALL=C.UTF-8] sort [{parametry}] [{soubor}]...

!parametry:

  • ☐ -u :: Po seřazení vyloučí duplicity (z každé skupiny duplicitních řádků ponechá pouze jeden).
  • ○ -c ○ -C :: Neřadí; jen zkontroluje, zda je vstup seřazený. Varianta „-c“ navíc vypíše první chybně seřazený řádek.
  • ☐ -k {definice-řadicího-klíče}{druh-a-příznaky-řazení} :: Definuje řadicí klíč, podle kterého se má řadit. Podrobněji – viz manuálová stránka příkazu sort.
  • ☐ -t {oddělovač} :: Definuje oddělovač polí při řazení podle klíčů.
  • ☐ -m :: Místo řazení pouze slučuje již seřazené soubory do jednoho.
  • ☐ -s :: Stabilní řazení. Zachová relativní pořadí řádků, jejichž všechny řadicí klíče se rovnají.
  • ○ -{druh-řazení} :: Přepne na jiný druh řazení než obyčejné řetězcové.
  • ☐ -{příznak-řazení} :: Nastaví příslušný příznak ovlivňující řazení.

Druhy řazení jsou: g, h, M, n, R, V. Za zmínku z nich stojí jen „n“ – řazení podle číselné hodnoty (včetně případných desetinných míst) a „h“ – totéž, ale s rozpoznáváním přípon K (kilo), M (mega) atd.

Příznaky řazení jsou tyto:

!parametry:

  • r :: Řadit sestupně (normálně se řadí vzestupně).
  • f :: Nerozlišovat velká a malá písmena.
  • d :: „Řazení jako ve slovníku“ – zohledňovat jen písmena, čísla a bílé znaky.
  • b :: Ignorovat bílé znaky na začátku klíče (při řazení podle číselné hodnoty se ignorují vždy).
  • i :: Ignorovat netisknutelné znaky.

Instalace na Ubuntu

Všechny použité nástroje jsou základními součástmi Ubuntu, s výjimkou gawk, které, pokud je potřebujete, je nutno doinstalovat:

*# *
sudo apt-get install gawk

!ÚzkýRežim: zap

Tipy a zkušenosti

  • Nastavení „LC_ALL=C“ zapíná řazení po bajtech podle jejich číselné hodnoty. Je rychlé, spolehlivé a dokonale přenositelné, nejde však o řazení pro člověka.
  • Pozor, „sort -k 2“ znamená řadit podle sloupců 2, 3, 4 atd. až do konce; řazení podle sloupce číslo 2 je „sort -k 2,2“!
  • Řazení podle klíčů může být pro začátečníka záludné. Doporučuji zvolený klíč nejprve otestovat na krátkém vstupním souboru s parametrem „--debug“.

Další zdroje informací

Nejlepším zdrojem podrobnějších informací o jednotlivých použitých příkazech (s výjimkou příkazu „column“) jsou jejich manuálové stránky.

Zákulisí kapitoly

V této verzi kapitoly chybí:

!KompaktníSeznam:

  • zpracování formátů CSV a PSV

Tato kapitola záměrně nepokrývá:

!KompaktníSeznam:

  • zpracování textových formátů se složitější strukturou jako např. JSON či XML

!ÚzkýRežim: vyp