GNU/Linux >> Znalost Linux >  >> Linux

Rozdělit jednotlivé znaky pomocí řetězce Null?

Četl jsem to v příručce Gawk:

ROZŠÍŘENÍ GNU

[…]

Možnost rozdělit jednotlivé znaky pomocí řetězce null jako
hodnoty FS a jako třetího argumentu pro split().

Zdá se však, že tomu tak není. Funguje to podle očekávání:

$ gawk 'BEGIN {print split("quebec", z, "")}'
6

a mohu zakázat další rozšíření:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined

ale nemohu vypnout chování rozdělení:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6

$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6

Díval jsem se také do manuálu Mawk:

Je-li FS =“”, pak mawk zlomí rekord na jednotlivé znaky a,
podobně split(s,A,””) umístí jednotlivé znaky s do A.

[…]

Posix výslovně ponechává chování FS =„“ nedefinované a zmiňuje
rozdělení záznamu na znaky jako možnou interpretaci, ale
v současné době toto použití nelze přenášet mezi implementacemi.

Takže s jakými implementacemi nemůžete získat jednotlivé znaky pomocí FS a
split ?

Přijatá odpověď:

To není POSIX v tom, že jej nemůžete použít ve skriptech POSIX, protože POSIX ponechává chování nespecifikováno . To znamená, že zatímco aplikace (skript) jej nemůže použít, pokud chce být přenosný, implementace (awk implementace) může dělat, co chce, pokud to děláte a stále budete POSIX. POSIX nevyžaduje awk rozdělit na znaky nebo bajty nebo nahlásit chybu nebo restartovat počítač, ponechá to nespecifikované.

Takže gawk nemá žádný důvod měnit své chování v tomto ohledu, když $POSIXLY_CORRECT je v prostředí¹, v tomto případě neexistuje žádné chování, které by bylo POSIXově správnější než to druhé.

Jak jste zjistili, toto rozšíření se nachází v gawk (od 3.0, leden 1996) a mawk (od verze 1.2, leden 1996). Je také v busybox awk (od začátku (2002)) a od května 1996 také v té, kterou spravuje Brian Kernighan (k v awk ) (FIXES soubor odkazuje na gawk , atd. jako inspiraci). Vypadá to, že to bylo přidáno do všech 3 během několika měsíců, což naznačuje, že to možná bylo diskutováno mezi jejich správci. Teď si nejsem tak jistý, kdo dostal nápad jako první.

S awk Briana Kernighana nebo ty, které jsou na něm založené jako FreeBSD nebo OpenBSD, všimněte si, že zatímco prázdný FS nebo prázdný třetí argument předaný do split() způsobí, že se řetězec rozdělí na jednotlivé znaky (no, bajty , viz níže), awk -F '' vrátí chybu (awk -v FS= je v pořádku).

Související:Převést genotypy na 0/1?

Na Solarisu s oběma nawk a /usr/xpg4/bin/awk (a také staré /bin/awk ze 70. let), prázdný FS Zdá se, že dělení úplně zakazuje. nawk -F '' vrátí chybu. Očekával bych, že to bude stejné na jiných komerčních Unices založených na kódu AT&T, jako je AIX nebo HP/UX, i když to tam nemohu otestovat.

Všimněte si také, že mawk , bwk awk (to se liší pro některé založené na něm) a busybox awk nepodporují vícebajtové znaky. Například v UTF-8:

echo Stéphane | awk -v FS= '{print $4}'

vypíše druhou polovinu třetího znaku v mém křestním jménu. Takže s těmi je správnější říci, že prázdný FS se rozdělí na jednotlivé bajty, nikoli znaky.

¹ Nyní si uvědomuji, že s POSIXLY_CORRECT nebo --posix , gawk zakáže některá rozšíření, která jinak nejsou v konfliktu s POSIX (typeof dělá gawk nevyhovující), takže by se dalo říci, že jde o opomenutí. Teď by to nebylo první. Například nezakáže nextfile i když je v konfliktu s POSIX (awk '{nextfile = 1}' je určen k přiřazení 1 k nextfile proměnná, ale hlásí chybu v gawk i pod POSIXLY_CORRECT).


Linux
  1. Výměna řetězce pomocí slovníku?

  2. Použití –exclude With The Du Command?

  3. Jak rozdělit řetězec ve skriptu Bash

  1. Rozdělit výstup příkazu podle sloupců pomocí Bash?

  2. Získejte poslední 4 znaky výstupu ze standardního výstupu

  3. Použití sed k rozdělení řetězce s oddělovačem

  1. Počítání znaků každého řádku s Wc?

  2. Příkaz pro tisk pouze posledních 3 znaků řetězce?

  3. Jak zjistím, co zabírá veškerý prostor na mém / oddílu?