Найти самый длинный участок шаблона из центра последовательности

Por lo que vale, yo tenía la petición contraria. Yo quería que apareciera la lista de notificaciones. Resulta que el valor predeterminado en lxde (o tal vez ubuntu )es notify-osd, que no muestra este ícono ni el historial de mensajes enviados por nada, incluido notify-send.

Lo cambié a notification-daemony hace exactamente lo que quiero que haga. No estoy seguro de cómo piratear los scripts de inicio o la configuración para que lxdelo haga automáticamente, pero ese es un problema solucionable.

-2
11.06.2020, 17:16
2 ответа

Я предполагаю, что вы имеете в виду под «от центра» «последовательность, которая включает средний символ строки. Я добавил строку к тестовым данным, так что средний символ строки не является ни C, ни T:

$ cat file
CCCCTGTTGCCAAACAATGC
TTTTCCCGCCTTTGGCCTAC
TACACGGAACCTCTTTTTTA
CATAAAAAAAAAAAAACTCT

Решение основано на переменных awk RSTART и RLENGTH, которые задаются как результат -произведения функции match (), соответствующей шаблону, и некоторой арифметике для отслеживания того, где мы находимся в строке:

awk '{
    line = $0
    max = max_ctr = 0
    mid = int(length($0)/2)
    idx = 1
    while (match( substr(line,idx), /[CT]+/ )) {
        if (RLENGTH > max) max = RLENGTH
        if (idx <= mid && mid <= idx+RLENGTH) max_ctr = RLENGTH
        idx += RSTART + RLENGTH - 1
    }
    print $0, max, max_ctr
}' file

выходы

CCCCTGTTGCCAAACAATGC 5 2
TTTTCCCGCCTTTGGCCTAC 7 5
TACACGGAACCTCTTTTTTA 10 10
CATAAAAAAAAAAAAACTCT 4 0
2
28.04.2021, 23:41

В случае, если «от центра» означает «самая длинная строка, ближайшая к центру, но не обязательно пересекающая его», вы можете попробовать

awk '
        {MID = int(length()/2);
         MX = PTR = 0 
         T0 = $0
         while (match ($0, /[CcTt]+/))  {if (RLENGTH > MX) MX = RLENGTH

                                         SSTR = PTR  + RSTART
                                         SEND = SSTR + RLENGTH - 1
                                         TMPS = SSTR - MID
                                         TMPE = MID  - SEND
                                         if  (SEND < MID)                                       {P = TMPE; RES = RLENGTH}
                                         else   {if (SSTR <= MID)                               {P = 0;    RES = RLENGTH}
                                                 else if ((P > TMPS) ||
                                                          (P == TMPS) && (RLENGTH >  RES))      {P = TMPS; RES = RLENGTH}
                                                }
                                         PTR  = SEND
                                         $0 = substr ($0, RSTART + RLENGTH)
                                        }
         print T0, MX, RES
        }
' file

Он перебирает строку от регулярного выражения до совпадения с регулярным выражением, сохраняя указатель на позицию в исходной строке. Таким образом, он подсчитывает расстояние между символами от конца строки до центра или от центра до начала строки и назначает длину строки наименьшего расстояния переменной результата. При равном расстоянии он сохраняет наибольшую длину.

Для шаблонов, пересекающих центр, результат эквивалентен образцам, приведенным ранее.

0
28.04.2021, 23:41

Теги

Похожие вопросы