The small linux problem thread

I’m a bit confused what’s happening with my Output redirection…

I wrote a short script to supply 2 files and calculate the VMAF, and I want the final score in the output file.

#!/bin/bash
if [ "$2" == "" ]; then
	echo "vmaf reference distorted"
	exit 1
fi

# https://github.com/Netflix/vmaf/blob/master/resource/doc/ffmpeg.md
ffmpeg 	-an -sn \
	-i "${1}" \
	-i "${2}" \
	-lavfi "[0:v:0]setpts=PTS-STARTPTS[reference]; \
			[1:v:0]setpts=PTS-STARTPTS[distorted]; \
			[distorted][reference]libvmaf=log_fmt=sub:log_path=${2%.*}.sub:n_threads=20" \
    -f null - \
	|& grep 'VMAF score:' | tail -n1 > "${2%.*}.score"

I’m using log_fmt=sub because it makes it easy to check low-scoring frames (because they get loaded as a subtitle in mpv).
Anyway, when I use this without the redirection I get what I want:

❯ ./vmaf in.mkv out.webm
[Parsed_libvmaf_2 @ 0x7f4bfc006600] VMAF score: 98.251637ate=N/A speed=3.89x

well… except for that garbage at the end. But when I use the redirection, my output file looks like this:

frame=   42 fps=0.0 q=-0.0 size=N/A time=00:00:01.71 bitrate=N/A speed=3.42x    
frame=   87 fps= 87 q=-0.0 size=N/A time=00:00:03.58 bitrate=N/A speed=3.59x    
frame=  135 fps= 90 q=-0.0 size=N/A time=00:00:05.58 bitrate=N/A speed=3.73x    
frame=  182 fps= 91 q=-0.0 size=N/A time=00:00:07.54 bitrate=N/A speed=3.77x    
frame=  227 fps= 91 q=-0.0 size=N/A time=00:00:09.42 bitrate=N/A speed=3.77x    
frame=  272 fps= 91 q=-0.0 size=N/A time=00:00:11.30 bitrate=N/A speed=3.77x    
frame=  317 fps= 91 q=-0.0 size=N/A time=00:00:13.18 bitrate=N/A speed=3.76x    
frame=  363 fps= 91 q=-0.0 size=N/A time=00:00:15.09 bitrate=N/A speed=3.77x    
frame=  410 fps= 91 q=-0.0 size=N/A time=00:00:17.05 bitrate=N/A speed=3.79x    
frame=  456 fps= 91 q=-0.0 size=N/A time=00:00:18.97 bitrate=N/A speed=3.79x    
frame=  503 fps= 91 q=-0.0 size=N/A time=00:00:20.93 bitrate=N/A speed=3.81x    
frame=  550 fps= 92 q=-0.0 size=N/A time=00:00:22.89 bitrate=N/A speed=3.82x    
frame=  596 fps= 92 q=-0.0 size=N/A time=00:00:24.81 bitrate=N/A speed=3.82x    
frame=  642 fps= 92 q=-0.0 size=N/A time=00:00:26.73 bitrate=N/A speed=3.82x    
frame=  686 fps= 91 q=-0.0 size=N/A time=00:00:28.57 bitrate=N/A speed=3.81x    
frame=  733 fps= 92 q=-0.0 size=N/A time=00:00:30.53 bitrate=N/A speed=3.82x    
frame=  779 fps= 92 q=-0.0 size=N/A time=00:00:32.44 bitrate=N/A speed=3.82x    
frame=  825 fps= 92 q=-0.0 size=N/A time=00:00:34.36 bitrate=N/A speed=3.82x    
frame=  870 fps= 92 q=-0.0 size=N/A time=00:00:36.24 bitrate=N/A speed=3.81x    
frame=  915 fps= 91 q=-0.0 size=N/A time=00:00:38.12 bitrate=N/A speed=3.81x    
frame=  961 fps= 91 q=-0.0 size=N/A time=00:00:40.04 bitrate=N/A speed=3.81x    
frame= 1006 fps= 91 q=-0.0 size=N/A time=00:00:41.91 bitrate=N/A speed=3.81x    
frame= 1052 fps= 91 q=-0.0 size=N/A time=00:00:43.83 bitrate=N/A speed=3.81x    
frame= 1098 fps= 91 q=-0.0 size=N/A time=00:00:45.75 bitrate=N/A speed=3.81x    
frame= 1143 fps= 91 q=-0.0 size=N/A time=00:00:47.63 bitrate=N/A speed=3.81x    
frame= 1188 fps= 91 q=-0.0 size=N/A time=00:00:49.50 bitrate=N/A speed=3.81x    
frame= 1234 fps= 91 q=-0.0 size=N/A time=00:00:51.42 bitrate=N/A speed=3.81x    
frame= 1280 fps= 91 q=-0.0 size=N/A time=00:00:53.34 bitrate=N/A speed=3.81x    
frame= 1325 fps= 91 q=-0.0 size=N/A time=00:00:55.22 bitrate=N/A speed=3.81x    
frame= 1370 fps= 91 q=-0.0 size=N/A time=00:00:57.09 bitrate=N/A speed=3.81x    
frame= 1414 fps= 91 q=-0.0 size=N/A time=00:00:58.93 bitrate=N/A speed= 3.8x    
frame= 1460 fps= 91 q=-0.0 size=N/A time=00:01:00.85 bitrate=N/A speed= 3.8x    
frame= 1506 fps= 91 q=-0.0 size=N/A time=00:01:02.77 bitrate=N/A speed= 3.8x    
frame= 1547 fps= 91 q=-0.0 size=N/A time=00:01:04.48 bitrate=N/A speed=3.79x    
frame= 1590 fps= 91 q=-0.0 size=N/A time=00:01:06.27 bitrate=N/A speed=3.79x    
frame= 1634 fps= 91 q=-0.0 size=N/A time=00:01:08.15 bitrate=N/A speed=3.78x    
frame= 1676 fps= 91 q=-0.0 size=N/A time=00:01:09.86 bitrate=N/A speed=3.77x    
frame= 1720 fps= 90 q=-0.0 size=N/A time=00:01:11.69 bitrate=N/A speed=3.77x    
frame= 1764 fps= 90 q=-0.0 size=N/A time=00:01:13.53 bitrate=N/A speed=3.77x    
frame= 1810 fps= 90 q=-0.0 size=N/A time=00:01:15.45 bitrate=N/A speed=3.77x    
frame= 1855 fps= 90 q=-0.0 size=N/A time=00:01:17.32 bitrate=N/A speed=3.77x    
frame= 1893 fps= 90 q=-0.0 size=N/A time=00:01:18.91 bitrate=N/A speed=3.76x    
frame= 1939 fps= 90 q=-0.0 size=N/A time=00:01:20.83 bitrate=N/A speed=3.76x    
frame= 1985 fps= 90 q=-0.0 size=N/A time=00:01:22.74 bitrate=N/A speed=3.76x    
frame= 2029 fps= 90 q=-0.0 size=N/A time=00:01:24.58 bitrate=N/A speed=3.76x    
frame= 2076 fps= 90 q=-0.0 size=N/A time=00:01:26.54 bitrate=N/A speed=3.76x    
[Parsed_libvmaf_2 @ 0x7f0a380067c0] VMAF score: 98.251637

It seems like this is capturing and redirecting some control characters too though because when I cat the file instead, I get this…?

❯ cat out.score
[Parsed_libvmaf_2 @ 0x7f0a380067c0] VMAF score: 98.251637ate=N/A speed=3.76x

How do I make it write only the final score line :confused:

From what I’m reading it seems the way the “updating lines” are achieved is by outputting a \r, so for tail everything is one line?

edit:
aha, got it:

…
	|& grep 'VMAF score:' | sed 's/.*\r//' | tee -a "${2%.*}.sub"

i.e. replace everything before (and including) \r with nothing.