Извлеките последние цифры из каждого слова в строке с несколькими словами, используя bash

Учитывая строку с несколькими словами, как показано ниже, все в одной строке:

first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540

Я пытаюсь набрать максимальное число из строки, в этом случае ответ должен быть 201805241548

Я пробовал использовать awk и grep, но получаю ответ только как последнее слово в строке.

Мне интересно, как этого добиться.

Покажи нам эти усилия. Добавьте это к вопросу, чтобы помочь вам в этом

Inian 24.05.2018 16:43
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
1
75
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
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?

ctac_ 24.05.2018 21:33

Другой 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

Как это работает: этот код создает код, а затем запускает его.

  1. z = "${n//+([a-z-])/;p=}"заменители не числа с некоторым предварительным кодом - установка $p на значение каждого числа (само по себе бесполезно). В этот момент echo $z выведет:

    ;p=201805241346 \ ;p=201805241348 \ ;p=201805241548 \ ;p=201705241540
    
  2. Замените добавленные ; на код более, который устанавливает $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))
    
  3. Распечатайте $m.

Может, есть способ, отличный от eval.

agc 25.05.2018 06:53

Другие вопросы по теме