Кажется, это работает:
awk -F, '{ p1 = substr($4, 1, 6);
p2 = ("0x" substr($4, 7, 4)) + 0;
p3 = ("0x" substr($4, 11, 4)) + 0;
printf "%s,%s,%s,%s,%d,%d\n", $1, $2, $3, p1, p2, p3;
}'
Для ваших входных данных сэмпла выдает:
123711184642,02,3583090366663629,639f02,292,14292
123715942138,01,3538710295145500,639f02,45014,50755
123711616258,02,3548370476972758,639f02,72,22322
Конкатенация строк «0x» плюс 4-значный шестнадцатеричный код, за которым следуетдобавив 0 сил awk
для обработки чисел как шестнадцатеричных.
Вы можете упростить это до:
awk -F, '{ p1 = substr($4, 1, 6);
p2 = "0x" substr($4, 7, 4);
p3 = "0x" substr($4, 11, 4);
printf "%s,%s,%s,%s,%d,%d\n", $1, $2, $3, p1, p2, p3;
}'
Строки с префиксом 0x становятся целочисленными при представлении printf()
иформат %d
.
Приведенный выше код прекрасно работает с собственным awk
на MacOS X 10.6.5 (версия 20070501);к сожалению, он не работает с GNU gawk
3.1.7.Это, похоже, разрешенное поведение в соответствии с POSIX (см. Комментарии ниже).Тем не менее, gawk
имеет нестандартную функцию strtonum
, которую можно использовать, чтобы заставить его работать правильно - жалко, что необходимо забивать.
gawk -F, '{ p1 = substr($4, 1, 6);
p2 = "0x" substr($4, 7, 4);
p3 = "0x" substr($4, 11, 4);
printf "%s,%s,%s,%s,%d,%d\n", $1, $2, $3, p1, strtonum(p2), strtonum(p3);
}'