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
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.
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 .
Experimente awk
:
awk -vRS='' 'max<$(NF-1){max=$(NF-1);tmp=$0};END{print tmp}' input.txt
Chame awk
em vim
:
:%!awk ...