【问题标题】:Choosing randomly between two possibilities在两种可能性之间随机选择
【发布时间】:2016-07-06 12:43:20
【问题描述】:

我有以下文件:

452 0/0 10 30 40 
460 0/1 0 40 40
500 0/0 5 35 40
600 0/1 15 25 40
800 1/1 40 0 40

真正的文件包含数百万行。如果第二个字段是 0/0,我打印第 3 列和第 5 列。如果第二个字段是 1/1,我打印第 4 列和第 5 列。使用此命令:

awk 'BEGIN{OFS="\t"}{ if($2=="0/0") {print $1, $2, $3, $5} else if($2=="1/1") {print $1, $2, $4, $5}}' file

问题是当第二个字段是0/1时。我想随机选择 0 或 1,如果选择 0,则打印第 3 列和第 5 列,如果选择 1,则打印第 4 列和第 5 列。

有没有办法在每次有 0/1 时随机选择 0 或 1?代码可以是 awk、bash 或 python。

【问题讨论】:

    标签: python bash random awk


    【解决方案1】:

    使用 paxdiablo 的 Random numbers generation with awk in BASH shell 技巧,您可以说:

    awk -v seed=$RANDOM 'BEGIN {srand(seed)}
              $2=="0/0" {chosen=3}
              $2=="1/1" {chosen=4}
              $2=="0/1" {chosen=3+int(rand()+0.5)}
              {print $chosen, $5}' file
    

    chosen 中,我们存储 3 或 4。使用 chosen=3+int(rand()+0.5),我们得到 3 或 4。

    让我们看看它的工作原理:

    $ awk -v seed=$RANDOM 'BEGIN {srand(seed)} $2=="0/0" {chosen=3} $2=="1/1" {chosen=4} $2=="0/1" {chosen=3+int(rand()+0.5)} {print $chosen, $5}' a
    10 40
    40 40
    5 40
    25 40
    0 40
    $ awk -v seed=$RANDOM 'BEGIN {srand(seed)} $2=="0/0" {chosen=3} $2=="1/1" {chosen=4} $2=="0/1" {chosen=3+int(rand()+0.5)} {print $chosen, $5}' a
    10 40
    40 40
    5 40
    15 40
    0 40
    

    【讨论】:

    • 谢谢!但这会为整个文件选择 0 或 1。需要的是在每次遇到时随机选择0或1,每行0/1。
    • 您需要在 BEGIN 块中使用 srand 否则在程序期间您将始终拥有相同的“随机”数字。
    • @Homap yeeep,我的随机生成出错了。现在它已经修复了。
    【解决方案2】:

    使用python的解决方案:您可以使用random并指向包含01的列表

    import random
    
    binaryChoice = ['0','1']
    field = ('0/1')
    if field == ('0/1'):
        choice = random.choice(binaryChoice)
        print (choice)
    

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 1970-01-01
      • 2019-08-19
      • 2010-09-14
      • 2012-03-27
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2020-05-17
      相关资源
      最近更新 更多