AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 417105
Accepted
Zombo
Zombo
Asked: 2018-01-15 12:05:42 +0800 CST2018-01-15 12:05:42 +0800 CST 2018-01-15 12:05:42 +0800 CST

Dividir caracteres individuais usando a string nula

  • 772

Eu li isso no manual do Gawk:

EXTENSÕES GNU

[...]

A capacidade de dividir caracteres individuais usando a string nula como o valor de FS e como o terceiro argumento para split().

No entanto, este parece não ser o caso. Isso funciona como esperado:

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

e posso desabilitar outras extensões:

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

mas não consigo desativar o comportamento de divisão:

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

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

Também procurei no manual do Mawk:

Se FS = "", então mawk divide o registro em caracteres individuais e, da mesma forma, split(s,A,"") coloca os caracteres individuais de s em A.

[...]

Posix deixa explicitamente o comportamento de FS = "" indefinido e menciona a divisão do registro em caracteres como uma possível interpretação, mas atualmente esse uso não é portátil entre as implementações.

Então, com quais implementações você não pode obter caracteres únicos com FSe split?

awk posix
  • 1 1 respostas
  • 1134 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-01-15T14:00:03+08:002018-01-15T14:00:03+08:00

    Isso não é POSIX, pois você não pode usá-lo em scripts POSIX porque o POSIX deixa o comportamento não especificado . Isso significa que enquanto um aplicativo (um script) não pode usá-lo se quiser ser portátil, uma implementação (uma awkimplementação) pode fazer o que quiser se você quiser e ainda ser POSIX. O POSIX não exige awka divisão em caracteres ou bytes, nem relata um erro, nem reinicializa o computador, ele o deixa sem especificação.

    Então gawknão tem porque mudar seu comportamento nesse sentido quando $POSIXLY_CORRECTestá no ambiente¹, não existe um comportamento mais POSIXAMENTE correto do que o outro naquela instância.

    Como você descobriu, essa extensão é encontrada em gawk (desde 3.0, janeiro de 1996) e mawk (desde a versão 1.2, janeiro de 1996). Também está na busybox awk(desde o início (2002)), e desde maio de 1996 também na mantida por Brian Kernighan (o kin awk) (o FIXESarquivo se refere a gawk, etc. como inspiração). Parece que foi adicionado a todos os 3 em alguns meses, sugerindo que talvez tenha sido discutido entre seus mantenedores. Não tenho tanta certeza de quem teve a ideia primeiro.

    Com o de Brian Kernighan awkou aqueles baseados nele como no FreeBSD ou OpenBSD, observe que enquanto um FSterceiro argumento vazio ou vazio passado split()faz com que a string seja dividida em seus caracteres individuais (bem, bytes , veja abaixo), awk -F ''retorna um erro ( awk -v FS=está bem embora).

    No Solaris, com ambos nawke /usr/xpg4/bin/awk(e também o antigo /bin/awkdos anos 70), um vazio FSparece desabilitar completamente a divisão. nawk -F ''retorna um erro. Eu esperaria que fosse o mesmo em outros Unices comerciais baseados em código AT&T como AIX ou HP/UX, embora eu não possa testá-lo lá.

    Observe também que mawk, bwk's awk(que é diferente para alguns baseados nele) e awk busybox não suportam caracteres multibyte. Então, por exemplo, em UTF-8:

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

    imprimiria a segunda metade do terceiro caractere do meu primeiro nome. Portanto, é mais correto dizer que um FS vazio se divide em bytes individuais, não em caracteres.


    ¹ Percebo agora que com POSIXLY_CORRECT, ou --posix, gawkdesativa algumas extensões que de outra forma não entram em conflito com POSIX ( typeoftorna gawk-se incompatível), então você pode dizer que é uma omissão. Agora não seria o primeiro. Por exemplo, ele não desabilita nextfile, embora entre em conflito com POSIX ( awk '{nextfile = 1}'destina-se a atribuir 1 à nextfilevariável, mas relata um erro gawkmesmo em POSIXLY_CORRECT).

    • 4

relate perguntas

  • remova o número de linhas duplicadas com base na correspondência antes da primeira vírgula

  • anexar linhas após outros arquivos linha por linha

  • Como remover uma única linha entre duas linhas

  • Reorganize as letras e compare duas palavras

  • Embaralhamento de arquivo de várias linhas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve