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知识足以修改其他代码,但这一个稍微复杂一点,可以让它在不满足条件时打印行(尽管我没有清楚地解释,但我的问题代码正在这样做);有没有可能用那种方式升级它?谢谢!