URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9793
[ Назад ]

Исходное сообщение
"cкрипт bash"

Отправлено dantecyk , 09-Дек-13 14:39 
Здравствуйте, форумчане!

Помогите пожалуйста написать скрипт. Задание такое:
На стандартный ввод вашего сценария поступает файл субтитров к видеоролику в следующем формате:
num
HH:MM:SS,SSS--> HH:MM:SS,SSS
text line 1
text line 2
. . .
Здесь num - номер блока, НН:MM:SS,SSS - начало и конец отображения подписи (text lines) к кадру. Каждый такой блок описывает подпись к очередной группе кадров. Эти блоки разделены пустыми строками. Сценарий должен скорректировать нумерацию блоков следующим образом. Два соседних блока должны иметь номера, отличающиеся на 1. Если очередной блок имеет более раннюю временную метку, он отбрасывается.
Пример:
$ cat cats.srt
144
00:16:12,90 --> 00:16:15,360
Я знаю кошку мягкую,

148
00:16:17,600 --> 00:16:19,680
Чье имя Дженни в точку,

143
00:15:47,960 --> 00:15:49,720
"Кому этот приз?"

144
00:16:22,280 --> 00:16:24,640
она как леопард ряба,

$ ./myscript.sh <cats.srt

144
00:16:12,920 --> 00:16:15,360
Я знаю кошку мягкую,

145
00:16:17,600 -- > 00:16:19,680
Чье имя Дженни в точку,

146
00:16:22,280 --> 00:16:24,640
Она как леопард ряба,

Буду очень благодарен за помощь. Спасибо за внимание.


Содержание

Сообщения в этом обсуждении
"cкрипт bash"
Отправлено pavlinux , 09-Дек-13 18:02 
> Помогите пожалуйста написать скрипт.

"Мужик, ну ты хотя бы лотерейный билет купи!" (с) Анек.

> Буду очень благодарен за помощь.

Очевидно, нужно разбить на блоки, которые разделены пустыми строками, и
отбрасывать, если очередной блок имеет более раннюю временную метку.

В чём проблема-то?


"cкрипт bash"
Отправлено dantecyk , 09-Дек-13 19:21 
>> Помогите пожалуйста написать скрипт.
> "Мужик, ну ты хотя бы лотерейный билет купи!" (с) Анек.
>> Буду очень благодарен за помощь.
> Очевидно, нужно разбить на блоки, которые разделены пустыми строками, и
> отбрасывать, если очередной блок имеет более раннюю временную метку.
> В чём проблема-то?

Спасибо за ответ.
Проблема в том, что во-первых, я не понимаю, как обратиться к конкретной строке, а во-вторых, не могу понять каким способом сравнивать время. на сколько я понимаю, нужно как то суммировать отдельные числа и потом сравнить, но как это сделать, я не понимаю... :(


"cкрипт bash"
Отправлено Andrey Mitrofanov , 09-Дек-13 18:12 
> Пример:
> $ cat cats.srt
> 144
> 00:16:12,90 --> 00:16:15,360
> Я знаю кошку мягкую,

$ cat_srt |awk -F \\n -v RS="\n\n" 'BEGIN{ORS=RS;OFS=FS}{if(nn=="")nn=$1;if(t==""||$2>t){$1=nn++;print;t=$2}}'
144
00:16:12,90 --> 00:16:15,360
Я знаю кошку мягкую,

145
00:16:17,600 --> 00:16:19,680
Чье имя Дженни в точку,

146
00:16:22,280 --> 00:16:24,640
она как леопард ряба,

$ _

> Буду очень благодарен за помощь. Спасибо за внимание.

Пожалуйста.


"cкрипт bash"
Отправлено dantecyk , 09-Дек-13 19:22 
>[оверквотинг удален]
> Я знаю кошку мягкую,
> 145
> 00:16:17,600 --> 00:16:19,680
> Чье имя Дженни в точку,
> 146
> 00:16:22,280 --> 00:16:24,640
> она как леопард ряба,
> $ _
>> Буду очень благодарен за помощь. Спасибо за внимание.
> Пожалуйста.

Андрей Митрофанов, спасибо большое за помощь. Если бы ты смог еще за комментировать хотя бы часть. А то у тебя написано мне кажется больно продвинутым способом, который мне понять пока не удается...


"cкрипт bash"
Отправлено Andrey Mitrofanov , 09-Дек-13 21:11 
> Андрей Митрофанов, спасибо большое за помощь. Если бы ты смог еще за
> комментировать хотя бы часть. А то у тебя написано мне кажется
> больно продвинутым способом, который мне понять пока не удается...

~Кончный автомат, читающий записи, разделённые пустой строкой, выводящий только те, что подходят и нумерующий их последовательно с номера, взятого из первой записи.

|awk -F \\n -v RS="\n\n" ' BEGIN{ORS=RS;OFS=FS}  #Это устновка
   #служебных переменных  для разделения вх.и вых.записей двумя переводами
   #строки, и поля внутри записей - одним переводом строки.

    {  #продвинутая програма AWK исполняет блок без условий для каждой строки
       # - записи то есть - и разбивает её на поля. Ою этом можно подробнейше
       # почитать в man awk-е

    if(nn=="")nn=$1   #тут в переменную кладётся номер блока, но только(1) первый(-ого)
    if(t==""||$2>t){  #если это первый блок(1) или время(2) позже, чем у предыдущего
        $1=nn++ #(2)
        print        #, то выводим этот блок.
        t=$2 #(3)
        }
    } # здесь блок "для каждой строки" закончился

#-(2) вывод каждой записи сопровождается установкой её номера из инкрементируемой
#тут же переменной nn
#-(3) в переменной t сохраняется время тек.записи - для сравнения со временем следующей
#-(1) по ходу дважды используется свойствот продвинутой програмы AWK считать
#   неициализированные переменные имеющими пустое строковое значение.

'



"cкрипт bash"
Отправлено dantecyk , 09-Дек-13 21:48 
>[оверквотинг удален]
>         t=$2 #(3)
>         }
>     } # здесь блок "для каждой строки" закончился
> #-(2) вывод каждой записи сопровождается установкой её номера из инкрементируемой
> #тут же переменной nn
> #-(3) в переменной t сохраняется время тек.записи - для сравнения со временем
> следующей
> #-(1) по ходу дважды используется свойствот продвинутой програмы AWK считать
> #   неициализированные переменные имеющими пустое строковое значение.
> '

Андрей Митрофанов, спасибо большое!!!
А можно с тобой как нибудь связаться, чтобы не засорять тут форум, спросить пару вопросов?(скайп или почта)?
з.ы вознаграждение гарантирую (:


"cкрипт bash"
Отправлено pavlinux , 09-Дек-13 23:29 
> з.ы вознаграждение гарантирую (:

Что ж ты раньше молчал. С этого нужно начинать тему. :)



"cкрипт bash"
Отправлено pavlinux , 09-Дек-13 21:26 
> Если бы ты смог еще за  комментировать хотя бы часть. А то у тебя написано мне кажется
> больно продвинутым способом, который мне понять пока не удается...

Митрофанов и комментарии не совместимы. :)