
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
N
Ich 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 time
keine 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 sed
wird 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 awk
an 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