gpt4 book ai didi

bash - 使用 sed 的随机行

转载 作者:行者123 更新时间:2023-11-29 09:38:56 24 4
gpt4 key购买 nike

我想用 sed 选择一个随机行。我知道 shuf -nsort -R | head -n 完成这项工作,但对于 shuf,您必须安装 coreutils,对于 sort solution,它不是在大数据上最优:

这是我测试过的:

echo "$var" | shuf -n1

哪个给出了最佳解决方案,但我担心可移植性这就是为什么我想用 sed 来尝试它。

`var="Hi
i am a student
learning scripts"`

output:
i am a student

output:
hi

它必须是随机的。

最佳答案

这在很大程度上取决于您希望伪随机概率分布是什么样子。 (不要尝试随机,满足于伪随机。如果你确实设法生成了一个真正的随机值,那就去领取你的诺贝尔奖吧。)如果你只想要一个均匀分布(例如,每一行都有相等的概率selected),那么你需要事先知道文件中有多少行。获得该分布并不像允许文件中较早的行更有可能被选中那么容易,因为这很容易,我们将这样做。假设行数小于32769,你可以简单地做:

N=$(wc -l < input-file)
sed -n -e $((RANDOM % N + 1))p input-file

-- 编辑--

想了想,我意识到你不需要知道行数,所以你不需要读取数据两次。我没有做过严格的分析,但我相信下面给出了一个均匀分布:

awk 'BEGIN{srand()} rand() < 1/NR { out=$0 } END { print out }' input-file

-- 编辑--Ed Morton 在评论中建议我们应该只能调用 rand() 一次。这似乎应该起作用,但似乎不起作用。好奇:

$ time for i in $(seq 400); do awk -v seed=$(( $(date +%s) + i)) 'BEGIN{srand(seed); r=rand()} r < 1/NR { out=$0 } END { print out}'  input; done | awk '{a[$0]++} END { for (i in a) print i, a[i]}' | sort
1 205
2 64
3 37
4 21
5 9
6 9
7 9
8 46

real 0m1.862s
user 0m0.689s
sys 0m0.907s
$ time for i in $(seq 400); do awk -v seed=$(( $(date +%s) + i)) 'BEGIN{srand(seed)} rand() < 1/NR { out=$0 } END { print out}' input; done | awk '{a[$0]++} END { for (i in a) print i, a[i]}' | sort
1 55
2 60
3 37
4 50
5 57
6 45
7 50
8 46

real 0m1.924s
user 0m0.710s
sys 0m0.932s

关于bash - 使用 sed 的随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55765192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com