Bash 使用awk数组或for循环插入随机字符串?
我正在创建如下播放列表:Bash 使用awk数组或for循环插入随机字符串?,bash,awk,Bash,Awk,我正在创建如下播放列表: 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之间的随
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循环吗?我应该将所有促销视频存储在一个数组中吗?我是不是完全错了
/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的
-v
参数将范围传递到命令中。您的想法肯定会奏效,但是请阅读shuf
实用程序的手册页,看看它是否已经有您需要的控件。您可能只是ls*.mp4*.promos>文件;shuf-特殊选项文件
,并获得您可以使用的结果。对不起,没有更多的时间了。祝你好运,谢谢你。当我运行它时,我得到awk:line 5:对数组促销的非法引用
和/plmaker:line 93:/dev/fd/63:权限被拒绝
我正在使用mawk 1.3.3,不确定这是否有区别?@crayingdrills:mawk
不支持数组的length()
。因为第一个子句已经在计算元素的赋值,所以我们可以使用该计数。只需将rand()*length(promos)
更改为rand()*p
。至于另一个错误,可能运行脚本的用户帐户没有对目录/dev/fd
或/proc/self/fd
或类似目录的写入权限,这很奇怪,但如果进程的一部分作为一个用户运行,而另一部分作为另一个用户运行,则可能会发生。您是否正在使用sudo
来运行它?好的,很好,这修复了第一个错误。至于第二个错误,那一定是我的语法错误。我重写了最后几行,现在可以了,非常感谢!
/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') -
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