У меня есть файлы в следующем форматеРаспаковка буквенно-цифровые значения
m.dat -c16 -S32m 1.3768702014349401 s, rate: 3.2434134115834929 GB/s.
m.dat -c16 -S64m 1.0852226612623781 s, rate: 4.115062684139847 GB/s.
m.dat -c20 -S1m 3.8889309875667095 s, rate: 1.1483256688332133 GB/s.
m.dat -c20 -S2m 16.622251618420705 s, rate: 0.26866151348562284 GB/s.
m.dat -c20 -S4m 4.5505061785224825 s, rate: 0.98137637927430543 GB/s.
m.dat -c20 -S8m 2.4563963813707232 s, rate: 1.8180124800752873 GB/s.
, и я хотел бы, чтобы извлечь различные числовые значения из них. В частности, я после того, как получить что-то похожее на это:
m.dat 20 4 4.5505061785224825 0.98137637927430543
То есть, я хотел бы, чтобы извлечь числовые значениябез символов плюс первое поле каждой строки в файле.
Я могу легко получить различное поле каждой строки с awk
, но эти значения также будут включать -c
и -S
, которые не представляют интереса.
awk '{print $1, $2, $3, $4}' file
вывод трубы в 'column -t', чтобы сделать его довольно –
Позвольте мне объяснить:' -a' разбивает каждую строку ввода на массив полей по пробелу, что дает доступ к 1-му полю как '@F [0]' , Затем вы объединяете это 1-ое поле с массивом числовых токенов в строке, полученным с помощью регулярного выражения, для формирования выходного массива '@ fields'. Передавая '@ fields' внутри двойных кавычек для' print', элементы массива преобразуются в строку с одним пробелом между элементами. Regex '/ .../g' неявно применяется к входной строке в целом и возвращает все (' g') соответствия в виде массива. По крайней мере, с вводом образца, будет работать более простой '/ \ d + (?: \. \ D +)?/G'. – mklement0
спасибо @ mklement0. Более сложное регулярное выражение фиксирует дробные числа без целой части. Если они не отображаются на входе, упростите. –