Ermitteln Sie den größten Wert der Ganzzahl in der wiederholten Zeichenfolge


2

Ich habe eine Skript-Protokolldatei, 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

Ich würde gerne den größten Wert Nin den Zeilen finden Script time: N seconds. Ich muss jedoch den Kontext beibehalten, daher Script timeist es keine praktikable Lösung , einfach alle Zeilen zu entfernen, die nicht darin enthalten sind.

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

Dies ist auf Vim 7.3 auf einem aktuellen CentOS. Ich würde es vorziehen, wenn möglich in VIM zu bleiben.

Antworten:


1

Ich bin mir nicht sicher, ob Sie einen Shell-Befehl in vim verwenden können, aber das wäre meine Lösung ... ein bisschen 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 ... 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 von dieser Stapelüberlauffrage genommen .


Danke, das ist ein interessanter Einzeiler! Allerdings ist das Rück es nur die Linie , aber nicht den Kontext, das ist eigentlich ganz einfach zu bekommen sind: cat t | grep "Script time:" | sort -r | head -n 1. Wie im OP erwähnt, möchte ich dem Kontext (den zugehörigen Protokolleintrag) hinzufügen!
Dotancohen

@dotancohen: Huh? Dies gibt den gesamten 4-Zeilen-Block in einer Zeile zurück (Entschuldigung) ... zumindest auf meinem Computer.
Bobby

0

Versuchen Sie awk:

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

Rufen Sie awkan vim:

:%!awk ...

0

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.