Encuentra el mayor valor de entero en la cadena de repetición


2

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 mayor valor de N en las lineas Script time: N seconds. Sin embargo, necesito mantener el contexto, así que simplemente elimine todas las líneas que no contengan Script time En ellos no es una solución viable.

Actualmente, estoy grepping para líneas con Script time, luego clasifíquelas para encontrar el valor más alto, luego vuelva al archivo original y busque ese valor. Sin embargo, si hay una manera más directa entonces me encantaría saber.

Esto es en Vim 7.3 en un reciente CentOS. Preferiría permanecer en VIM si es posible.

Respuestas:


1

No estoy seguro si puedes 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

Soooo ... 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

los sed se toma de esta pregunta de desbordamiento de pila .


¡Gracias, es una frase interesante! Sin embargo, solo devuelve la línea pero no el contexto, que en realidad se puede obtener de manera muy simple: cat t | grep "Script time:" | sort -r | head -n 1. ¡Como se mencionó en el OP, estoy buscando agregar contexto (la entrada de registro asociada) a eso!
dotancohen

@dotancohen: ¿Eh? Esto devuelve el bloque completo de 4 líneas en una línea (perdón por eso) ... al menos lo hizo en mi máquina.
Bobby

0

Tratar awk:

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

Llamada awk en vim:

:%!awk ...

0

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.