
Tengo un archivo de registro de script que se parece un poco a esto:
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
Me gustaría encontrar el valor más grande de N
en las líneas Script time: N seconds
. Sin embargo, necesito mantener el contexto, por lo que simplemente eliminar todas las líneas que no contienen Script time
no es una solución viable.
Actualmente, estoy buscando líneas con Script time
, luego las ordeno para encontrar el valor más alto, luego vuelvo al archivo original y busco ese valor. Sin embargo, si hay una manera más sencilla, me encantaría saberla.
Esto está en Vim 7.3 en un CentOS reciente. Preferiría permanecer en VIM si es posible.
Respuesta1
No estoy seguro de poder usar un comando de shell en vim, pero esta sería mi solución... un poco 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
Muuuuuy... breve explicación:
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
el sed
esta tomadode esta pregunta de desbordamiento de pila.
Respuesta2
Intentar awk
:
awk -vRS='' 'max<$(NF-1){max=$(NF-1);tmp=$0};END{print tmp}' input.txt
Llame awk
a vim
:
:%!awk ...
Respuesta3
Encontré la solución con esta función VIM:
function Find()
execute "g!/Script/d"
execute "sort"
normal G
normal 0v$"ay
normal u
execute "call search('".@a."')"
endfunction