Experimente isso
echo 'Ü X' | awk '{printf("|% 2s|% 2s|\n", $1, $2)}'
para uma saída de |Ü| X|
. Obviamente awk
conta o comprimento de bytes, não o comprimento de caracteres do Ü
, então a contagem é 2 e nenhum preenchimento à esquerda com espaço é necessário, como é para o X
.
É possível executar awk
em um modo que conta o comprimento dos caracteres do %<count>s
printf
padrão, não o comprimento dos bytes?
A mesma pergunta existe bash
para printf
: https://superuser.com/a/1599024/345087 . Espero que a resposta não seja a mesma: "passagem para libc printf" :-/
EDITAR em vez de comentar para melhor visibilidade: eu não estava usando gawk
, mas qualquer versão que o Ubuntu 22.04 tivesse instalado para mim. Não me ocorreu que nada gawk
pudesse ser instalado atualmente :-/ Obrigado pelas respostas detalhadas.
GNU awk (e possivelmente algumas outras variantes do awk):
Bash 3.0+ (e possivelmente alguns outros shells, possivelmente com ajustes):
Observe que a versão bash deve ser definida
LC_ALL
no shell que está sendo executado${#a}
, não apenas noprintf
ambiente s como está acontecendo com aawk
versão, e então se você não quiserLC_ALL
alterar o shell de chamada, você precisa salvá-lo/restaurá-lo, ou sejao="$LC_ALL"; LC_ALL='en_US.UTF-8' ... "$b"; LC_ALL="$o"
, ou faça tudo em um subshell, ou seja( LC_ALL='en_US.UTF-8' ... "$b" )
, .Explicações:
Da documentação do GNU awk :
Usar o GNU awk 5.2.2 para definir um código de idioma apropriado tratará caracteres multibyte como caracteres únicos de vários bytes:
enquanto usar uma localidade diferente, ou usar
-b
, tratará todas as entradas como caracteres de byte único:Quando
-b
é usado, o resultado é independente da sua localidade:Como @StéphaneChazelas mencionou em um comentário , consulte Por que o printf está "diminuindo" o trema? para o comportamento relacionado do
printf
shell, onde a resposta de @Léa Gris sugere que isso obterá a contagem de caracteres e, portanto, a saída formatada, correta no bash 3.0 e posterior:e essa funcionalidade também é afetada pela localidade:
Consulte também length-of-string-in-bash para obter mais informações sobre como obter o comprimento dos caracteres no bash.