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