как сохранить n знаков после запятой?

Отделка:

ffmpeg -i input.mts -ss 00:00:20.0 -c copy -t 00:00:30.0 output.mkv

Ищите 20 секунд -(i )n input.mkv (и отбрасываете, по умолчанию )пусть играет 30 секунд и отбрасываете оттуда все остальное. Итак, у вас есть 30-секундное видео.

Исчезновение

Сначала вам нужно создать изображение для фейда. Вероятно, одно изображение *. png, полностью белое или полностью черное, в зависимости от вашего вкуса. Желательно в том же разрешении, в котором было записано ваше видео.

ffmpeg -r 1/2 -i black.png -c:v libx264 -r 50 -y -pix_fmt yuv420p fade2s.mkv

Это означает, что затемнение 2 секунды (-r ввод :1 / 2 x 50 кадров в секунду = 100 кадров в секунду ). Информацию об изображении вы можете найти в The Gimp или ImageMagick. Теперь у вас есть эффект затухания.

Постепенное появление:

ffmpeg -i fade2s.mkv -y -vf fade=in:0:50 fade_in.mkv

Нарастание от 0 до 50 кадров (1 секунда -50 кадров в секунду)

Постепенное появление + исчезновение:Возьмите последний ввод в качестве нарастания и добавьте немного затухания

ffmpeg -i fade_in.mkv -y -vf fade=out:120:50 fade_in_out.mkv

Готово.

0
21.04.2018, 22:10
2 ответа

Сawk:

awk '{ printf("%.3g %.3g\n", $1, $2) }' file

При заданных данных получается

0.993 0.00704
0.646 0.354
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.5 0.5

Обратите внимание, что 0,00704 имеет пять десятичных знаков, но три значащих цифры.

Если вы хотите ровно три десятичных знака, используйте %.3fвместо %.3gи получите

0.993 0.007
0.646 0.354
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.500 0.500

Приведенные выше два варианта могут быть обобщены для переменного количества столбцов с использованием GNUawk:

awk -v CONVFMT='%.3g' '{ for (i=1; i<=NF; ++i) $i+=0; print }' file

Цикл с $i+=0заставляет awkповторно -форматировать значение каждого поля как число с плавающей запятой, что он будет делать, принимая во внимание CONVFMT(, что он будет более или менее делать эквивалент$i=sprintf(CONVFMT, $i)).


Если вы хотите вырезать цифры:

awk '{ for (i=1; i<=NF; ++i) $i=sprintf("%.5s", $i); print }' file

Это обрабатывает числа как строки и обрезает их после пяти символов (, что предполагает, что все числа меньше 10 и больше нуля ), генерируя

0.992 0.007
0.646 0.353
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.5 0.5

Для более общего сокращения чисел:

awk '{ for (i=1; i<=NF; ++i) if (match($i,".*\\.[0-9]?[0-9]?[0-9]?")) $i=substr($i,RSTART,RLENGTH); print }' file

Операция в цикле обрезает числа в точке, в которой заканчивается совпадение данного регулярного выражения (, если оно соответствует ).

8
28.01.2020, 02:14

В ваших данных нет чисел выше 1. Я расширил исходный файл, включив в него некоторые значения с большим количеством цифр перед точкой:

$ cat infile
0.992957746478873 0.00704225352112677
0.646410833917366 0.353589166082634
0.992957746478873 0.00704225352112677
0.5 0.5
16.258137489137 333444.277775666
16.233399999999 333777.277111111

печать

Одним из возможных решений является использование C-совместимой функции printf (В awk есть одна):

формат f (3 (округленные )десятичные разряды)

Точное число 3 (округленных )десятичных знаков:

$ awk '{ printf("%11.3f %11.3f\n", $1,$2) }' infile
      0.993       0.007
      0.646       0.354
      0.993       0.007
      0.500       0.500
     16.258  333444.278
     16.233  333777.277

Обратите внимание, что 0.992957746478873округляется до 0.993.

формат g (значащее (округленное))

Точное количество 3 (значащих )цифр:

$ awk '{ printf("%9.3g %9.3g\n", $1,$2) }' infile
    0.993   0.00704
    0.646     0.354
    0.993   0.00704
      0.5       0.5
     16.3  3.33e+05
     16.2  3.34e+05

Обратите внимание на округление четвертой цифры (, например 3.34e+05)

Строка (не закругленная)

Ровно 3 (не округленные )цифры после запятой.

Использование GNU awk:

$ gawk '{for(i=1;i<=NF;i++){
         printf( "%12s ",gensub(/([0-9]+\.[0-9]{0,3}).*/, "\\1", "g", $i))};print""}
       ' infile
       0.992        0.007
       0.646        0.353
       0.992        0.007
         0.5          0.5
      16.258   333444.277
      16.233   333777.277

Использование sed (возможно быстрее):

$ sed -E 's/([0-9]+\.[0-9]{1,3})[^ ]*/\1/g' infile
0.992 0.007
0.646 0.353
0.992 0.007
0.5 0.5
16.258 333444.277
16.233 333777.277
3
28.01.2020, 02:14

Теги

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