Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 当条件满足时,AWK随机选择2个动作中的1个_Bash_Awk - Fatal编程技术网

Bash 当条件满足时,AWK随机选择2个动作中的1个

Bash 当条件满足时,AWK随机选择2个动作中的1个,bash,awk,Bash,Awk,当我的条件满足以下条件时,我可以用文件中的另一个值替换一个值: awk '{if (length($4)*2+1 != length($5) && $10 ~ /^1\/2/) sub("1/2","1/1"); print}' MyFile 在my 2条件为真的行中,将“1/2”替换为“1/1” 在我的文件中有几个这样的案例,我真正想做的是在大约一半的案例中用“1/1”替换“1/2”,而在大约另一半的案例中用“2/2”替换“1/2”。也就是说,随机选择两种可能的操作之一sub

当我的条件满足以下条件时,我可以用文件中的另一个值替换一个值:

awk '{if (length($4)*2+1 != length($5) && $10 ~ /^1\/2/) sub("1/2","1/1"); print}' MyFile
在my 2条件为真的行中,将“1/2”替换为“1/1”

在我的文件中有几个这样的案例,我真正想做的是在大约一半的案例中用“1/1”替换“1/2”,而在大约另一半的案例中用“2/2”替换“1/2”。也就是说,随机选择两种可能的操作之一
sub(“1/2”、“1/1”)
sub(“1/2”、“2/2”)
。这有可能吗

非常感谢

awk'
awk '
    length($4)*2+1 != length($5) && $10 ~ /^1\/2/ {
        sub("1/2", rand() < 0.5 ? "1/1" : "2/2")
        print
    }
' MyFile
长度($4)*2+1!=长度($5)&$10~/^1\/2/{ 子(“1/2”,rand()<0.5?/1:“2/2”) 打印 } “我的文件
为每一行调用rand()的问题是,最终可能导致所有子()都相同。要保证大约一半,您可以执行以下操作:

awk '
    BEGIN { srand() }
    length($4)*2+1 != length($5) && $10 ~ /^1\/2/ {
        if ( ++cnt % 2 ) {
            dir = (rand() < 0.5 ? 1 : 0)
        }
        else {
            dir = !dir
        }
        sub("1/2", (dir ? "1/1" : "2/2"))
    }
    { print }
' MyFile
awk'
开始{srand()}
长度($4)*2+1!=长度($5)&$10~/^1\/2/{
如果(++cnt%2){
dir=(rand()<0.5?1:0)
}
否则{
dir=!dir
}
子(“1/2”(目录?“1/1”:“2/2”))
}
{print}
“我的文件

但是它的随机性要小一些,因为每第二行与前一行相反。

这里是另一种动态调整阈值以产生更平衡分布的方法

awk 'BEGIN {srand()}
     length($4)*2+1 != length($5) && $10 ~ /^1\/2/ {
          r=rand()<(1-(c1+1)/(c+2)); 
          c1+=r; c++;
          sub("1/2", r?"1/1":"2/2")}1' file
awk'开始{srand()}
长度($4)*2+1!=长度($5)&$10~/^1\/2/{

r=rand()
如果(rand()>0.5)
可能?小心这个
$10~/^1\/2/
——如果$10==“1/23456”就会匹配——你想改用
$10==“1/2”
吗(这更容易阅读)?添加
开始{srand()}
可能很有用。如果每次在同一个输入文件上运行脚本时都需要不同的输出,这是必要的。谢谢!这只是在满足条件时才打印行(对不起,我的问题不清楚)。如果其他人也希望这样做,下面的版本也会按原样打印文件中的其他行:
awk'{if(length($4)*2+1!=length($5)&&$10~/^1\/2/)sub(“1/2”,rand()<0.5?/1):“2/2”);print}'MyFile
谢谢你Ed!你说得对!有一点:我的awk知识足以修改其他代码,但这一个稍微复杂一点,可以让它在不满足条件时打印行(尽管我没有清楚地解释,但我的问题代码正在这样做);有没有可能用那种方式升级它?谢谢!