Извлечь последние цифры из каждого слова в строке с несколькими словами, используя bash - PullRequest
0 голосов
/ 24 мая 2018

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

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

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

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

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

Ответы [ 4 ]

0 голосов
/ 25 мая 2018

Gnarly pure 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. Заменить добавленные ; s на more код, который устанавливает $m на наибольшее значение$p, для запуска которого требуется eval - фактический код, который запускает вся строка с 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. Print $m.

0 голосов
/ 24 мая 2018

Используя одну команду 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}'
0 голосов
/ 24 мая 2018

Еще один awk

echo 'first-...-201705241540' | awk -v RS='[^0-9]+' '$0>max{max=$0} END{print max}'
0 голосов
/ 24 мая 2018
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...