
У меня есть файл журнала скрипта, который выглядит примерно так:
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
в строках Script time: N seconds
. Однако мне нужно сохранить контекст, поэтому простое удаление всех строк, которые не содержат Script time
в них, не является жизнеспособным решением.
В настоящее время я ищу строки с Script time
, затем сортирую их, чтобы найти наибольшее значение, затем возвращаюсь к исходному файлу и ищу это значение. Однако, если есть более простой способ, то я бы с удовольствием узнал.
Это на Vim 7.3 на последнем CentOS. Я бы предпочел остаться в VIM, если это возможно.
решение1
Я не уверен, можно ли использовать команду оболочки в vim, но это было бы моим решением... немного хакерским:
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
Тааак...краткое объяснение:
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
взятоsed
из этого вопроса Stack Overflow.
решение2
Пытаться awk
:
awk -vRS='' 'max<$(NF-1){max=$(NF-1);tmp=$0};END{print tmp}' input.txt
Вызывать :awk
vim
:%!awk ...
решение3
Я нашел решение с помощью этой функции VIM:
function Find()
execute "g!/Script/d"
execute "sort"
normal G
normal 0v$"ay
normal u
execute "call search('".@a."')"
endfunction