bash - 使用 awk 进行无放回采样

标签 bash shell awk

我有很多这样的文本文件:

>ALGKAHOLAGGATACCATAGATGGCACGCCCT
>BLGKAHOLAGGATACCATAGATGGCACGCCCT
>HLGKAHOLAGGATACCATAGATGGCACGCCCT
>DLGKAHOLAGGATACCATAGATGGCACGCCCT
>ELGKAHOLAGGATACCATAGATGGCACGCCCT
>FLGKAHOLAGGATACCATAGATGGCACGCCCT
>JGGKAHOLAGGATACCATAGATGGCACGCCCT
>POGKAHOLAGGATACCATAGATGGCACGCCCT

有没有办法使用 awk 进行采样而不用替换?

例如,我有这 8 行,我只想在新文件中随机抽取其中的 4 行,而不进行替换。 输出应如下所示:

>FLGKAHOLAGGATACCATAGATGGCACGCCCT
>POGKAHOLAGGATACCATAGATGGCACGCCCT    
>ALGKAHOLAGGATACCATAGATGGCACGCCCT
>BLGKAHOLAGGATACCATAGATGGCACGCCCT

提前致谢

最佳答案

随机抽取 10% 的行怎么样?

awk 'rand()>0.9' yourfile1 yourfile2 anotherfile

我不确定你所说的“替换”是什么意思...这里没有替换,只是随机选择。

基本上,它会精确地查看每个文件的每一行一次,并在 0 到 1 的区间内生成一个随机数。如果随机数大于 0.9,则输出该行。所以基本上它是为每一行掷一个 10 面的骰子,只有当骰子出现为 10 时才打印它。一行不可能被打印两次 - 当然,除非它在你的文件中出现两次。

为了增加随机性 (!),您可以按照@klashxx 的建议在开头添加一个 srand()

awk 'BEGIN{srand()} rand()>0.9' yourfile(s)

关于bash - 使用 awk 进行无放回采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22303717/

相关文章:

node.js - 作为不同的用户在 su 中永远运行

bash - 如何通过单独的 grep 过滤器发送 stderr 和 stdout?

linux - 将数据转换为单引号

bash - 如何创建 100 个文件,每个文件中有 1 个随机数,并根据数字授予它们权限

linux - 如何在搜索后打印所有具有相同前缀的文件?

linux - sudo: (whatever): 在 RHEL 5.8 上找不到命令

linux - 如何在末尾有效添加linux命令选项?

shell - 意外 token 附近的语法错误

awk - 在awk中选择行和元素

bash - 删除具有相似前缀的重复行