Я пытаюсь преобразовать 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
Спасибо :)
Я нашел более легкий ответ 's/\b (\w) \b/0\1/g' файл. Я хочу использовать awk, но sed имеет \b (между словесным символом и несловесным символом)
perl -pe 's/\b([0-9a-f](:|$))/0$1/g' ex
0
перед всеми исключительными hexdecimal цифрами, сопровождаемыми ":" или конец строки Я думаю, что Вы спрашиваете, то, как к нулевой клавиатуре шестнадцатеричные элементы разделенной от двоеточия строки в третьем поле. Это (возможно, удивительно) трудно для выполнения awk
потому что:
%s
(строка) спецификатор формата не поддерживает дополнение нуля (ни один в awk
ни в базовом C функционируют AFAIK),и
%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