Finden Sie den größten Ganzzahlwert in einer sich wiederholenden Zeichenfolge

Finden Sie den größten Ganzzahlwert in einer sich wiederholenden Zeichenfolge

Ich habe eine Skriptprotokolldatei, die ungefähr so ​​aussieht:

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

NIch möchte den größten Wert in den Zeilen finden Script time: N seconds. Allerdings muss ich den Kontext beibehalten, daher ist das einfache Entfernen aller Zeilen, die nicht enthalten, Script timekeine praktikable Lösung.

Derzeit suche ich nach Zeilen mit Script time, sortiere diese dann, um den höchsten Wert zu finden, gehe dann zurück zur Originaldatei und suche nach diesem Wert. Wenn es jedoch einen einfacheren Weg gibt, würde ich ihn gerne kennen.

Dies ist auf Vim 7.3 auf einem aktuellen CentOS. Ich würde, wenn möglich, lieber bei VIM bleiben.

Antwort1

Ich bin nicht sicher, ob Sie in vim einen Shell-Befehl verwenden können, aber das hier wäre meine Lösung ... ein bisschen hackig:

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...kurze Erklärung:

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

Das sedwird genommenaus dieser Stack Overflow-Frage.

Antwort2

Versuchen awk:

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

Rufen Sie awkan vim:

:%!awk ...

Antwort3

Ich habe die Lösung mit dieser VIM-Funktion gefunden:

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

verwandte Informationen