Учитывая строку с несколькими словами, как показано ниже, все в одной строке:
first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540
Я пытаюсь набрать максимальное число из строки, в этом случае ответ должен быть 201805241548
Я пробовал использовать awk и grep, но получаю ответ только как последнее слово в строке.
Мне интересно, как этого добиться.


echo 'first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540' |\
grep -o '[0-9]\+' | sort -n | tail -1
Соответствующая часть - grep -o '[0-9]\+' | sort -n | tail -n 1.
Используя одну команду gnu awk:
s='first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540'
awk -F- -v RS='[[:blank:]]+' '$NF>max{max=$NF} END{print max}' <<< "$s"
201805241548
Или с помощью grep + awk (если gnu awk недоступен):
grep -Eo '[0-9]+' <<< "$s" | awk '$1>max{max=$1} END{print max}'
Почему вы говорите gnu awk?
Другой awk
echo 'first-...-201705241540' | awk -v RS='[^0-9]+' '$0>max{max=$0} END{print max}'
Невероятно чистый bash:
n='first-second-third-201805241346 \
first-second-third-201805241348 \
first-second-third-201805241548 \
first-second-third-201705241540'
z = "${n//+([a-z-])/;p=}"
p=0 m=0 eval echo -n "${z//\;/\;m=\$((m>p?m:p))\;};m=\$((m>p?m:p))"
echo $m
Выход:
201805241548
Как это работает: этот код создает код, а затем запускает его.
z = "${n//+([a-z-])/;p=}"заменители не числа с некоторым предварительным кодом
- установка $p на значение каждого числа (само по себе бесполезно). В этот момент echo $z выведет:
;p=201805241346 \ ;p=201805241348 \ ;p=201805241548 \ ;p=201705241540
Замените добавленные ; на код более, который устанавливает $m на
наибольшая ценность $p, для работы которой требуется eval - фактическая
code вся строка с eval выглядит так:
p=0 m=0
m=$((m>p?m:p));p=201805241346
m=$((m>p?m:p));p=201805241348
m=$((m>p?m:p));p=201805241548
m=$((m>p?m:p));p=201705241540
m=$((m>p?m:p))
Распечатайте $m.
Может, есть способ, отличный от eval.
Покажи нам эти усилия. Добавьте это к вопросу, чтобы помочь вам в этом