Но ваша аргументация ошибочна: вы измеряли только время, необходимое для [116250]echo XYZ[116251], а не фактические [116252]sed[116253] вызовы. Однако, вы увидите, что все равно быстрее не использовать трубы :)
Точный ответ требует, чтобы вы указываете свою проблему немного больше. Тем не менее, общий синтаксис утверждения awk:
PATTERN { ACTION }
действие будет выполнено только для строк, которые соответствует шаблону. Таким образом, мы можем использовать Pattern
, чтобы подмножество строкой и блоком действия подмножество столбцом. Например, с учетом вашего ввода я могу использовать следующее:
> awk '/^[0-9]/ {print $3 }' INPUTFILE
5.421M
5.120M
5.100M
Шаблон
здесь является регулярным выражением, которое соответствует любой линии, в которой первый символ является целым числом от 0 до 9. Чтобы удалить M
Вы сможете либо трусить это в другую команду, такую как TR
или использовать команду GSUB
, как в
Ответ Cuonglm
awk '/^[0-9]/ { gsub(/M/, "", $3); print $3 }' INPUT_FILE
Точный ответ требует, чтобы вы указали свою проблему немного больше. Однако общий синтаксис оператора awk:
PATTERN { ACTION }
ACTION будет выполняться только для строк, соответствующих ОБРАЗЕЦ. Таким образом, можно использовать ОБРАЗЦЫ
для поднабора по строкам, а блок ACTION - для поднабора по столбцам. Например, учитывая ваш ввод, я мог бы использовать следующее:
> awk '/^[0-9]/ {print $3 }' INPUTFILE
5.421M
5.120M
5.100M
ОБРАЗЕЦ
здесь является регулярным выражением, которое соответствует любой строке, где первый символ является целым числом от 0 до 9. Чтобы удалить M
, можно либо передать его другой команде, например tr
, либо использовать команду gsub
, как показано в
Ответ cuonglm
awk '/^[0-9]/ { gsub(/M/, "", $3); print $3 }' INPUT_FILE
-121--157774- Если вы не намерены выполнять какую-либо операцию с текстом, использование sed
кажется более резонансным
sed -En 's/.* (\S+)M$/\1/p'
-E
давайте избегать использования метасимволов с обратной косой чертой (\( ,\+,
и т.д.)
-n
подавить вывод, за исключением того, что он упорядочен по p
s/
заменить
. *
первая часть строки для космоса (последнее пространство становится жадным)
()
«revers ссылки» - можно вызвать образец внутри скобок по \number
\S
каждому не-пространственному симболу (все, кроме :пусто:
)
+
один или несколько предыдущих симболов
M $
«M» в конце строки
/p
печати, где производится подстановка
Означает «Заменить всю строку образца внутри скобок и печатать строки, где такая подстановка производится только»
-121--157776-Вы также можете использовать функцию сопоставления в состоянии awk.
awk '{match($3, /[0-9]+.[0-9]+/,arr)}{ print arr[0]}' file
Вы можете удалить все, что не являются цифрами или точками перед печатью:
$ awk '{gsub(/[^[:digit:].]/,"",$3);print $3}' file
5.421
5.120
5.100
-121--157775- Я не нашел решение с awk, но это сработало:
cat test |grep ":"| cut -f3 -d " " | sed 's/[MGB]//g'
Вы можете удалить все, что не цифру или точка перед печатью:
$ awk '{gsub(/[^[:digit:].]/,"",$3);print $3}' file
5.421
5.120
5.100
Если вы не собираетесь выполнять какую-либо операцию с текстом, то использование sed
кажется более резонансным
sed -En 's/.* (\S+)M$/\1/p'
-E
, давайте избегать использования мета-символов с обратным слешем (\(, \+,
и т.д.). )
-n
подавим вывод, кроме случаев, когда он упорядочен по p
s/
replace
. *
первая часть строки для пробела (последний пробел - жадность)
()
"обратная ссылка" - вы можете вызвать паттерн в скобках по \number
\S
каждый не пробельный симбол (все, кроме :пустой:
)
+
один или несколько предыдущих simbol
M$
"M" в конце строки
/p
строки печати, где производится замена
Значит "Замените всю строку на образец внутри скобок и печатайте строки, где производится только такая замена"
.