我正在创建这样的播放列表:
promo="/videos/promo.mp4"
/usr/bin/shuf playlist.m3u | awk -v n=5 '1; NR % n == 0 { print "'$promo'" }' | tee playlist.m3u archives/playlist.m3u > /dev/null
这很好,但我想:
1)有多个宣传片可供选择,这样每5个视频就有不同的宣传片。
( 2) n也是一个随机数,所以它不是每5个视频,更像是一个介于2到6之间的随机数。
我可以从一个宣传片文件夹中获得一个视频列表。
ls -d -1 "$PWD/"**
我需要一个for循环吗?我应该将所有的宣传片存储在一个数组中吗?我是不是搞错了?
发布于 2019-08-13 01:13:55
/usr/bin/shuf playlist.m3u | awk 'BEGIN {srand(); r = 6; p = 0} NR == FNR {promos[p++] = $0; next} {print} ++c == r {print promos[int(rand() * length(promos))]; r = int(rand()*5+2); c = 0}' <(find /videos -type f -name 'promo*.mp4') -
为了可读性而爆发的:
/usr/bin/shuf playlist.m3u | awk 'BEGIN {srand(); r = 6; p = 0}
NR == FNR {promos[p++] = $0; next}
{print}
++c == r {
print promos[int(rand() * length(promos))];
r = int(rand()*5+2); c = 0
}' <(find /videos -type f -name 'promo*.mp4') -
AWK命令使用Bash进程替换将find
( promo文件列表)的输出读入数组中。NR == FNR
子句循环(next
)遍历每个文件名,直到列表被完全读取(FNR
重置为1)。
然后,通过shuf
参数从STDIN
读取-
命令的输出,并打印每一行。如果计数器等于随机数(第一次使用数字r
是在BEGIN
子句中分配的),那么从数组中打印一个随机选择。为promo间隔计算一个新的随机数介于2到6之间,并将计数器重置为0。
示例输出:
song14.ext
song6.ext
song21.ext
song18.ext
song9.ext
song11.ext
/videos/promo8.ext
song2.ext
song20.ext
song27.ext
/videos/promo4.ext
song8.ext
(带有假扩展名的假文件名)
您可以使用AWK的-v
参数将范围传递到命令中。
https://stackoverflow.com/questions/57466814
复制相似问题