Encontre o maior valor de inteiro na string de repetição

2

Eu tenho um arquivo de log de script que parece um pouco com isto:

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

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

Atualmente estou buscando 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.

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

    
por dotancohen 19.09.2012 / 09:35

3 respostas

0

Eu 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
    
por 01.10.2012 / 14:40
1

Não tenho certeza se você pode usar um comando shell no vim, mas essa seria a 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

Soooo ... 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 é obtido desta questão de estouro de pilha .

    
por 19.09.2012 / 11:18
0

Experimente awk :

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

Chame awk em vim :

:%!awk ...
    
por 19.09.2012 / 12:47

Tags