2

У меня есть файл журнала сценария, который выглядит примерно так:

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, если это возможно.

3 ответа3

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 взят из этого вопроса переполнения стека.

0

Попробуйте awk:

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

Звоните awk в vim:

:%!awk ...
0

Я нашел решение с помощью этой функции VIM:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .