#!/usr/bin/awk -f function realtime (t) { sub(/,/, ".", t); split(t, artime, /:/); rt = 0; for (i in artime) rt = rt * 60 + artime[i]; return rt; } function printtime (rt) { f = sprintf("%.2f", rt); sub(/^.*\./, "", f); t = sprintf("%02d.%s", int(rt % 60), f); for (i=1; i<3; i++) { rt = int (rt / 60); temp = rt % 60; t = sprintf("%02d:%s", temp, t); } return t; } BEGIN { if ((ARGC < 3) || (ARGC > 4)) { printf "Usage: SubRipSync.awk [output]\n" \ >> "/dev/stderr"; printf " sync: delay in time ([+-]HH:MM:SS.mm)\n" >> "/dev/stderr"; exit(-1); } output = (ARGC == 4) ? ARGV[3] : ""; if (output != "") printf "" > output; sync = ARGV[1]; syncsig = (index(sync, "-") == 0) ? 1 : -1; gsub(/-/, "", sync); sync = syncsig * realtime(sync); write = 1; ARGV[3] = ARGV[1] = ""; } # For dos and mac { sub(/\r/, "", $0); sub(/\f/, "", $0); } $1 ~ /[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9],[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9]/ { split($1, arline, /,/); beg = realtime(arline[1]); end = realtime(arline[2]); write = (end + sync > 0); if (write) { beg += sync; end += sync; if (beg < 0) beg = 0; $0 = printtime(beg) "," printtime(end); } else { printf "You throw out message %s --> %s\n", \ printtime(beg), printtime(end) >> "/dev/stderr"; } } write == 1 { if (output == "") { printf "%s\n", $0; } else { printf "%s\n", $0 >> output; } }