По умолчанию awk
видит три столбца в ваших данных, а столбец 2 содержит только &
(а столбец 3 содержит числа). Если вы измените разделитель поля на &
, то у вас будет два столбца с конечными пробелами в столбце 1 и начальными пробелами в столбце 2 (и некоторыми конечными пробелами, как это происходит; попробуйте скопировать данные из вопроса).
В awk
вы можете преобразовать столбец 2 с начальными пробелами в число, добавив 0
: $2 + 0
заставит его обрабатываться как число. Если вы используете $2
в числовом контексте, оно будет рассматриваться как число. И наоборот, вы можете заставить awk
рассматривать поле как строку, объединяя ее с пустой строкой: $2 ""
будет строкой.
Так что нет необходимости в сложности регулярных выражений, чтобы получить число - если данные так просты, как показано.
Вы говорите, что хотите использовать match
; непонятно, для чего это нужно.
awk -F'&' '{ printf "F1 [%s], F2 [%10s] = [%d] = [%-6d] = [%06d]\n", $1, $2, $2, $2, $2 }' data
Для ваших данных, которые имеют один пробел в конце первых двух строк и двойной пробел в конце третьей, вывод:
F1 [foobar99 ], F2 [ 68 ] = [68] = [68 ] = [000068]
F1 [foobar4 ], F2 [ 43 ] = [43] = [43 ] = [000043]
F1 [foobar2 ], F2 [ 73 ] = [73] = [73 ] = [000073]
Обратите внимание, что мне не нужно явно преобразовывать $2
в число. Форматы printf
обрабатывают его как строку или число в зависимости от того, использовал ли я %s
или %d
.
Если вам нужно, вы можете лишить конечных пробелов $1
(или даже $2
), но, не зная, что еще нужно сделать, сложно с пользой продемонстрировать альтернативы.
Итак, я думаю, awk
делает то, что вам нужно, без необходимости прыгать через обручи. Для лучшего объяснения вам нужно предоставить лучший вопрос, описывающий или показывающий, что вы хотите сделать.