Данные подмножества с awk

[115885]Да, две команды, которые вы разместили, на 100% эквивалентны, так что вы можете безопасно изменить ваш скрипт, чтобы не использовать трубы.

Но ваша аргументация ошибочна: вы измеряли только время, необходимое для [116250]echo XYZ[116251], а не фактические [116252]sed[116253] вызовы. Однако, вы увидите, что все равно быстрее не использовать трубы :)

1
20.08.2017, 06:54
5 ответов

Точный ответ требует, чтобы вы указываете свою проблему немного больше. Тем не менее, общий синтаксис утверждения 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
3
27.01.2020, 23:17

Точный ответ требует, чтобы вы указали свою проблему немного больше. Однако общий синтаксис оператора 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
0
27.01.2020, 23:17

Вы можете удалить все, что не являются цифрами или точками перед печатью:

$ 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'
0
27.01.2020, 23:17

Вы можете удалить все, что не цифру или точка перед печатью:

$ awk '{gsub(/[^[:digit:].]/,"",$3);print $3}' file
5.421
5.120
5.100
1
27.01.2020, 23:17

Если вы не собираетесь выполнять какую-либо операцию с текстом, то использование sed кажется более резонансным

sed -En 's/.* (\S+)M$/\1/p'

-E, давайте избегать использования мета-символов с обратным слешем (\(, \+, и т.д.). )

-n подавим вывод, кроме случаев, когда он упорядочен по p

s/ replace

. * первая часть строки для пробела (последний пробел - жадность)

() "обратная ссылка" - вы можете вызвать паттерн в скобках по \number

\S каждый не пробельный симбол (все, кроме :пустой: )

+ один или несколько предыдущих simbol

M$ "M" в конце строки

/p строки печати, где производится замена

Значит "Замените всю строку на образец внутри скобок и печатайте строки, где производится только такая замена"

.
1
27.01.2020, 23:17

Теги

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