Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Два приема работы с текстовой выдачей

Привет, коллеги. Модель, с которой я работаю, записывает в файл некоторые среднесуточные характеристики в виде таблицы такого вида: дата в виде day 001/2023, затем слово min, max или ave с двоеточием, затем, соответственно, минимальные, максимальные и средние значения за сутки. Первой строкой идут некоторые имена, чтоб легче определить, какой столбец что означает. Это всё приходится рассматривать и рисовать графики. Как облегчить себе эти две задачи, я и расскажу. Чтобы визуально отличать строки (минимумы, максимумы и средние желательно раскрасить в разные цвета), нужно создать свою раскраску по синтаксису. Это очень просто. Создайте файлик out.vim: syntax clear
syntax match outMin /min:.*/
syntax match outMean /ave:.*/
syntax match outMax /max:.*/
syntax match outDate /\d\+\/\d\+/
highlight outMin ctermfg=6 term=underline
highlight outMean ctermfg=2
highlight outMax ctermfg=3
highlight outDate ctermfg=6 ctermbg=0 Первая строка очищает синтаксис, следующие четыре создаю

Привет, коллеги. Модель, с которой я работаю, записывает в файл некоторые среднесуточные характеристики в виде таблицы такого вида:

дата в виде day 001/2023, затем слово min, max или ave с двоеточием, затем, соответственно, минимальные, максимальные и средние значения за сутки. Первой строкой идут некоторые имена, чтоб легче определить, какой столбец что означает.

Это всё приходится рассматривать и рисовать графики. Как облегчить себе эти две задачи, я и расскажу.

Чтобы визуально отличать строки (минимумы, максимумы и средние желательно раскрасить в разные цвета), нужно создать свою раскраску по синтаксису. Это очень просто. Создайте файлик out.vim:

syntax clear
syntax match outMin /min:.*/
syntax match outMean /ave:.*/
syntax match outMax /max:.*/
syntax match outDate /\d\+\/\d\+/
highlight outMin ctermfg=6 term=underline
highlight outMean ctermfg=2
highlight outMax ctermfg=3
highlight outDate ctermfg=6 ctermbg=0

Первая строка очищает синтаксис, следующие четыре создают шаблоны с именами outMin и так далее. Именно шаблон, которому присуще регулярное выражение, и будет определять раскраску текста, который под шаблон подпадает. Для минимумов у нас шаблон outMin и выражение /min:.*/, которое читается "текст 'min', двоеточие и потом что угодно до конца строки".

Наконец, четыре строки назначают шаблонам цветовые схемы. Не всё может работать во всех терминалах, например, подчеркивание не всегда есть. В общем-то, важно задать цвет текста (ctermfg) и, возможно, изменить цвет фона (ctermbg).

Раскрасить файл очень просто: :so out.vim, а потом при автообновлении он сам будет перекрашиваться, а при обновлении вручную (через :e!) надо повторить. Можно повесить :e! | so out.vim на клавишу вроде <F12> через :map.

Чтобы рисовать, надо отфильтровать строки с минимумами и максимумами, оставив только средние, и убрать всю лишнюю информацию. Это делается вручную очень просто, и можно записать макрос через qq (старт записи в регистр q, не забудьте только завершить запись нажатием q еще раз). Запустить макрос легко через @q. Но макрос можно вставить в текст из регистра как любой другой текст: "qp и потом использовать повторно. Я так и поступил: расшифровав свои действия, получил такой скрипт:

:normal ggyG
:!rm -f bio.ave.out
:tabnew bio.ave.out
:normal Pgg
:s/^.*;//
:2,$v/ave/d
:2,$s/^.*://
:w!
:noh

Его надо сохранить в файл вроде mkave.vim

Первая строка выполняет в нормальном режиме команду ggyG. Это две команды: gg переходит на первую строку, yG копирует всё до конца файла. То есть, мы копируем весь файл в буфер. Да, если файл очень велик - это рискованно.

Далее мы удаляем посредством внешней утилиты rm (доступ к ней через восклицательный знак) файл bio.ave.out

Создаем файл в новой вкладке и вставляем туда текст через P, одновременно переходя на первую строку.

В первой строке удаляем всё до первого имени столбца. Там у меня такой текст: "day of year;data;" так что удаление до ; работает как надо: больше этот символ в строке не встречается.

На строках начиная со второй (2,$) проводим фильтрацию (:v): удаляем (/d) все строки, не содержащие текста 'ave'.

На оставшихся строках, начиная со второй, проводим замену, заменяя всё от начала строки (^) до двоеточия. Это дата и указатель 'ave:'

Записываем файл (:w!)

Отключаем выделение того, что искали: чисто косметическое действие.

Файл готов.

-2

В дальнейшем можно повторить всё это одной командой:

:so mkave.vim

Кстати, если использовать вариант so! (с восклицательным знаком), то скрипт выполняется не построчно, а посимвольно, как будто вы это печатаете. В частности, можно обойтись без команды :normal. Файл будет такой:
ggyG:!rm -f bio.ave.out
:tabnew bio.ave.out
Pgg:s/^.*;// :2,$v/ave/d
:2,$s/^.*://
:w! | noh

Теперь таблицу можно считать в R:

bio=read.table('bio.ave.out', header=TRUE)

и получить dataframe с именованными столбцами. И рисуйте:

plot(bio$DIC, type='l', col='red')

В принципе, и рисование можно автоматизировать, при желании.

На самом деле, при достижении такого взаимопонимания с командной строкой, вообще не понимаешь надобности во всех этих ваших оконных средствах. Они нужны только для графики!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022

Наука
7 млн интересуются