Termín "pole" je často spojován s nástroji jako cut
a awk
. Pole by bylo podobné sloupcům v hodnotě dat, pokud data vezmete a oddělíte je pomocí specifického znaku. Typickým znakem, který se k tomu používá, je Mezerník .
Nicméně, jak je tomu u většiny nástrojů, je konfigurovatelný. Například:
- awk =
awk -F"," ...
- odděluje se čárkami (tj. , ). - cut =
cut -d"," ...
- odděluje se čárkami (tj. , ).
Příklady
Tento první ukazuje, jak awk
automaticky se rozdělí na mezery.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Tento ukazuje, jak cut
rozdělí se také na mezery.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Zde máme CSV seznam dat sloupců, které používáme cut
vrátíte sloupce 1 a 4.
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Awk to také umí:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk je také o něco zběhlejší v zacházení s různými separačními postavami. Zde se jedná o Tabs spolu s Spaces kde jsou vzájemně smíchány ve stejnou dobu:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
A co přepínač -s pro vyjmutí?
S ohledem na tento přepínač jednoduše říká cut
netisknout žádné řádky, které neobsahují oddělovací znak zadaný pomocí -d
přepínač.
Příklad
Řekněme, že jsme měli tento soubor.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
POZNÁMKA: Ve 2. řetězci výše jsou mezery a tabulátory.
Nyní, když zpracujeme tyto řetězce pomocí cut
s a bez -s
přepínač:
$ cut -d" " -f1-6 sample.txt
This is a space string.
This is a space
Thisstringcontainsneither.
$ cut -d" " -f1-6 -s sample.txt
This is a space string.
This is a space
Ve 2. příkladu můžete vidět, že -s
switch vynechal z výstupu všechny řetězce, které neobsahují oddělovač Mezerník .
Pole podle POSIX je jakákoli část řádku oddělená kterýmkoli ze znaků v IFS
, "oddělovač vstupních polí (nebo vnitřní oddělovač polí )." Výchozí hodnota je mezera, za kterou následuje vodorovný tabulátor, za kterým následuje nový řádek. Pomocí Bash můžete spustit printf '%q\n' "$IFS"
abyste viděli jeho hodnotu.
Záleží na příslušném nástroji, ale pro cut
, "pole" začíná na začátku řádku textu a zahrnuje vše až po první kartu. Druhé pole běží od znaku za první záložkou až po další záložku. A tak dále pro třetí, čtvrtý, ... Vše mezi tabulátory nebo mezi začátkem řádku a tabulátorem nebo mezi tabulátorem a koncem řádku.
Pokud nezadáte oddělovač pole s volbou "-d":cut -d: -f2
dostanete vše mezi první a druhou dvojtečkou (':') znaky.
Jiné nástroje mají různé definice, ale znak tabulátoru je běžný. awk
je dobrý návrat, pokud cut
je příliš striktní, jako awk
rozděluje pole na základě jednoho nebo více bílých znaků. To je v mnoha situacích trochu přirozenější, ale musíte znát trochu syntaxe. Chcete-li vytisknout druhé pole podle awk
:
awk '{print $2}'
sort
je ten, který mě podvádí. Moje aktuální sort
manuálová stránka říká něco jako "neprázdný přechod na prázdný" pro oddělovač polí. Z nějakého důvodu trvá získání sort
několik pokusů správně definovaná pole. join
zřejmě používá pole "oddělená mezerami", což je to, co awk
ve výchozím nastavení to dělá.
Morálka příběhu je být opatrný a experimentovat, pokud to nevíte.