Использование awk для изменения значений третьей колонки

Я пытаюсь преобразовать 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

6 ответов

perl -pe 's/\b([0-9a-f](:|$))/0$1/g' ex добавить 0 перед всеми шестнадцатеричными шестнадцатеричными цифрами, за которыми следует «:» или конец строки
0
ответ дан 18 July 2018 в 13:48

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

1
ответ дан 18 July 2018 в 13:48

Я думаю, что вы спрашиваете, как обнулить шестнадцатеричные элементы разделенной двоеточием строки в третьем поле. Это (возможно, удивительно) трудно сделать в 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
1
ответ дан 18 July 2018 в 13:48
perl -pe 's/\b([0-9a-f](:|$))/0$1/g' ex добавить 0 перед всеми шестнадцатеричными шестнадцатеричными цифрами, за которыми следует «:» или конец строки
0
ответ дан 24 July 2018 в 20:16

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

1
ответ дан 24 July 2018 в 20:16

Я думаю, что вы спрашиваете, как обнулить шестнадцатеричные элементы разделенной двоеточием строки в третьем поле. Это (возможно, удивительно) трудно сделать в 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
1
ответ дан 24 July 2018 в 20:16
  • 1
    Я нашел более легкий ответ sed / \ b (\ w) \ b / 0 \ 1 / g 'для работы \ b (между символом слова и символом не-слова). Спасибо за быстрый ответ. – joseph rob 5 May 2017 в 02:50

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

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