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