Eu acho que o que você está perguntando é como zerar os elementos hexadecimais da string separada por dois pontos no terceiro campo. Isso é (talvez surpreendentemente) difícil de fazer em awk
porque:
- o especificador de formato
%s
(string) não suporta preenchimento com zero (nem emawk
nem na função C subjacente AFAIK)
e
- se você usar o formato numérico apropriado
%02x
, os argumentos serão implicitamente convertidos como dígitos decimais primeiro (descartando a-f como lixo) - resultando em valores hexadecimais incorretos.
Se você tem o GNU awk, você pode manipular e converter dígitos hexadecimais usando a opção de linha de comando --non-decimal-data
, no entanto, os próprios elementos precisam ser prefixados com 0x
para forçar a conversão. Então, por exemplo
gawk --non-decimal-data '
gsub(/[[:xdigit:]][[:xdigit:]]?/,"0x&",) && split(,a,":") {
=sprintf("%02x:%02x:%02x:%02x:%02x:%02x",a[1],a[2],a[3],a[4],a[5],a[6])
} 1' OFS='\t' file
ABC 22.22.28.97 00:00:0c:9f:f0:d9
ABC 22.22.28.109 00:50:56:64:49:f3
ABC 22.22.28.110 00:50:56:68:55:8e
É um pouco mais simples em perl
, onde você pode usar a função hex
e a simples substituição de regex:
perl -alne '$F[2] =~ s/([[:xdigit:]]{1,2})/sprintf "%02x", hex()/ge , print join "\t", @F' file
ABC 22.22.28.97 00:00:0c:9f:f0:d9
ABC 22.22.28.109 00:50:56:64:49:f3
ABC 22.22.28.110 00:50:56:68:55:8e