Usando o awk para modificar os valores da 3ª coluna

1

Estou tentando converter a terceira coluna como mostrado abaixo. Eu posso usar essa função para

convert ***awk '{print }'  | awk -F: '{printf("%02s:%02s:%02s:%02s:%02s:%02s\n",,,,,,)}'*** but how to get it to replace the 3rd column values.

Before 

ABC    22.22.28.97     0:0:c:9f:f0:d9

ABC    22.22.28.109    0:50:56:64:49:f3

ABC    22.22.28.110    0:50:56:68:55:8e

After

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

Obrigado:)

    
por joseph rob 04.05.2017 / 21:50

3 respostas

1

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:

  1. o especificador de formato %s (string) não suporta preenchimento com zero (nem em awk nem na função C subjacente AFAIK)

e

  1. 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
    
por steeldriver 05.05.2017 / 00:10
1

Eu encontrei um arquivo / \ b (\ w) \ b / 0 \ 1 / g 'mais fácil de responder. Eu quero usar o awk, mas sed tem o \ b (entre um caractere de palavra e um caractere de não-palavra)

    
por joseph rob 05.05.2017 / 20:27
0
perl -pe 's/\b([0-9a-f](:|$))/0/g' ex
  • adicione um 0 antes de todos os dígitos hexadecimais singulares seguidos de ":" ou fim de linha
por JJoao 07.05.2017 / 23:44