Используя awk для изменения 3-х Значений столбцов

Я пытаюсь преобразовать 3-й столбец как показано ниже. Я могу использовать эту функцию для

convert ***awk '{print $3}'  | awk -F: '{printf("%02s:%02s:%02s:%02s:%02s:%02s\n",$1,$2,$3,$4,$5,$6)}'*** 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

Спасибо :)

1
задан 4 May 2017 в 22:53

3 ответа

Я нашел более легкий ответ 's/\b (\w) \b/0\1/g' файл. Я хочу использовать awk, но sed имеет \b (между словесным символом и несловесным символом)

0
ответ дан 8 December 2019 в 05:29
perl -pe 's/\b([0-9a-f](:|$))/0$1/g' ex
  • добавляют 0 перед всеми исключительными hexdecimal цифрами, сопровождаемыми ":" или конец строки
0
ответ дан 8 December 2019 в 05:29

Я думаю, что Вы спрашиваете, то, как к нулевой клавиатуре шестнадцатеричные элементы разделенной от двоеточия строки в третьем поле. Это (возможно, удивительно) трудно для выполнения awk потому что:

  1. %s (строка) спецификатор формата не поддерживает дополнение нуля (ни один в awk ни в базовом C функционируют AFAIK),

и

  1. если Вы используете соответствующий числовой формат %02x затем аргументы неявно преобразовываются как десятичные цифры сначала (отбрасывание a-f как мусор) - приводящий к неправильным шестнадцатеричным значениям.

Если у Вас есть GNU awk, можно управлять и преобразовать шестнадцатеричные цифры с помощью --non-decimal-data параметр командной строки, однако сами элементы должны быть снабжены префиксом 0x вызвать преобразование. Так, например,

gawk --non-decimal-data '
  gsub(/[[:xdigit:]][[:xdigit:]]?/,"0x&",$3) && split($3,a,":") {
    $3=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

Это несколько более просто в perl где можно использовать hex функционируйте и простая regex замена:

perl -alne '$F[2] =~ s/([[:xdigit:]]{1,2})/sprintf "%02x", hex($1)/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
0
ответ дан 8 December 2019 в 05:29

Другие вопросы по тегам:

Похожие вопросы: