GNU/Linux >> Linux Esercitazione >  >> Linux

Dividere i singoli caratteri usando la stringa nulla?

Ho letto questo nel manuale di Gawk:

ESTENSIONI GNU

[…]

La possibilità di suddividere i singoli caratteri utilizzando la stringa nulla come valore
di FS e come terzo argomento per dividere().

Tuttavia questo sembra non essere il caso. Funziona come previsto:

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

e posso disabilitare altre estensioni:

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

ma non riesco a disabilitare il comportamento di divisione:

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

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

Ho anche guardato il manuale di Mawk:

Se FS =“”, allora mawk suddivide il record in singoli caratteri e,
allo stesso modo, split(s,A,””) inserisce i singoli caratteri di s in A.

[…]

Posix lascia esplicitamente indefinito il comportamento di FS =“” e menziona
la suddivisione del record in caratteri come possibile interpretazione, ma
attualmente questo uso non è trasferibile tra le implementazioni.

Quindi, con quali implementazioni non puoi ottenere singoli caratteri con FS e
split ?

Risposta accettata:

Non è POSIX in quanto non puoi usarlo negli script POSIX perché POSIX lascia il comportamento non specificato . Ciò significa che mentre un'applicazione (uno script) non può utilizzarlo se vuole essere portatile, un'implementazione (un awk implementazione) può fare tutto ciò che vuole se lo fai ed essere ancora POSIX. POSIX non richiede awk per dividere in caratteri o byte, o segnalare un errore, o riavviare il computer, non viene specificato.

Quindi gawk non ha motivo di cambiare il suo comportamento a tale riguardo quando $POSIXLY_CORRECT è nell'ambiente¹, non esiste un comportamento più POSIXly corretto dell'altro in quel caso.

Come hai scoperto, quell'estensione si trova in gawk (dalla versione 3.0, gennaio 1996) e mawk (dalla versione 1.2, gennaio 1996). È anche in busybox awk (dall'inizio (2002)), e dal maggio 1996 anche in quello curato da Brian Kernighan (il k in awk ) (il FIXES il file fa riferimento a gawk , ecc. come ispirazione). Sembra che sia stato aggiunto a tutti e 3 in pochi mesi suggerendo che forse è stato discusso tra i loro manutentori. Non sono così sicuro ora chi ha avuto l'idea per primo.

Con awk di Brian Kernighan o quelli basati su di esso come su FreeBSD o OpenBSD, nota che mentre un FS vuoto o un terzo argomento vuoto passato a split() fa sì che la stringa venga suddivisa nei suoi singoli caratteri (beh, byte , vedi sotto), awk -F '' restituisce un errore (awk -v FS= va bene comunque).

Correlati:convertire i genotipi in 0/1?

Su Solaris, con entrambi nawk e /usr/xpg4/bin/awk (e anche il vecchio /bin/awk degli anni '70), un FS vuoto sembra disabilitare del tutto la divisione. nawk -F '' restituisce un errore. Mi aspetto che sarebbe lo stesso su altri Unice commerciali basati su codice AT&T come AIX o HP/UX, anche se non posso testarlo lì.

Nota anche che mawk , awk di bwk (è diverso per alcuni basati su di esso) e busybox awk non supportano i caratteri multibyte. Ad esempio, in UTF-8:

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

stamperebbe la seconda metà del terzo carattere nel mio nome. Quindi, con quelli, è più corretto dire che un FS vuoto si divide in singoli byte, non in caratteri.

¹ Adesso mi rendo conto che con POSIXLY_CORRECT, o --posix , gawk disabilita alcune estensioni che altrimenti non sono in conflitto con POSIX (typeof fa gawk non conforme), quindi potresti dire che è un'omissione. Ora non sarebbe il primo. Ad esempio, non disabilita nextfile anche se è in conflitto con POSIX (awk '{nextfile = 1}' ha lo scopo di assegnare 1 al nextfile variabile ma segnala un errore in gawk anche sotto POSIXLY_CORRECT).


Linux
  1. Contando i caratteri di ogni riga con Wc?

  2. Un comando per stampare solo gli ultimi 3 caratteri di una stringa?

  3. Come dividere una stringa nello script Bash

  4. Dividi l'output del comando per colonne usando Bash?

  5. Utilizzo di sed per dividere una stringa con un delimitatore

Usando il comando gratuito di Linux

Utilizzo del file di configurazione SSH

Tutorial sull'uso del comando Timeout su Linux

Usando –exclude con il comando Du?

Usare il comando tr in Linux per giocare con i personaggi

Ottieni gli ultimi 4 caratteri dell'output da standard out