Encontre o maior valor do número inteiro na string repetida

Encontre o maior valor do número inteiro na string repetida

Eu tenho um arquivo de log de script parecido com este:

2012-9-16
Did something
Did 345 things
Script time: 244 seconds

2012-9-17
Did yet something
Did another thing 23 times
Script time: 352 seconds

2012-9-18
Did something special for 34 seconds 51 times
Did nothing at all
Script time: 122 seconds

Gostaria de encontrar o maior valor de Nnas linhas Script time: N seconds. No entanto, preciso manter o contexto, portanto, simplesmente remover todas as linhas que não contêm Script timenão é uma solução viável.

Atualmente, estou procurando linhas com Script time, classificando-as para encontrar o valor mais alto, depois voltando ao arquivo original e procurando por esse valor. No entanto, se houver uma maneira mais direta, eu adoraria saber.

Isso está no Vim 7.3 em um CentOS recente. Eu preferiria permanecer no VIM, se possível.

Responder1

Não tenho certeza se você pode usar um comando shell no vim, mas esta seria minha solução... um pouco hacky:

cat test.txt | sed ":a;N;$!ba;s/\n\n/###/g" | sed ":a;N;$!ba;s/\n/ /g" | sed "s/###/\n/g" | sort "-nrt:" -k2 | head -1

Entããão...breve explicação:

cat test.txt                  # Can be omitted as sed does also accept files,
                              # but I like it for readability
sed ":a;N;$!ba;s/\n\n/###/g"  # Replace the double-newlines with a placeholder
sed ":a;N;$!ba;s/\n/ /g"      # Replace all newlines with a space
sed "s/###/\n/g"              # Replace all placeholders with a newline
sort "-nrt:" -k2              # Sort numeric, reverse, use the :  as delimiter and
                              # use the second field for sorting
head -1                       # Give us only the first line

O sedé levadodesta pergunta do Stack Overflow.

Responder2

Tentar awk:

awk -vRS='' 'max<$(NF-1){max=$(NF-1);tmp=$0};END{print tmp}' input.txt

Ligue :awkvim

:%!awk ...

Responder3

Encontrei a solução com esta função VIM:

function Find()
    execute "g!/Script/d"
    execute "sort"
    normal G
    normal 0v$"ay
    normal u
    execute "call search('".@a."')"
endfunction

informação relacionada