首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >插入带有awk数组或for循环的随机字符串?

插入带有awk数组或for循环的随机字符串?
EN

Stack Overflow用户
提问于 2019-08-12 19:00:31
回答 1查看 137关注 0票数 1

我正在创建这样的播放列表:

代码语言:javascript
运行
复制
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之间的随机数。

我可以从一个宣传片文件夹中获得一个视频列表。

代码语言:javascript
运行
复制
  ls -d -1 "$PWD/"**

我需要一个for循环吗?我应该将所有的宣传片存储在一个数组中吗?我是不是搞错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 01:13:55

代码语言:javascript
运行
复制
/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') -

为了可读性而爆发的:

代码语言:javascript
运行
复制
/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。

示例输出:

代码语言:javascript
运行
复制
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参数将范围传递到命令中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57466814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档