gpt4 book ai didi

for-loop - for 循环中的 If 运算符

转载 作者:行者123 更新时间:2023-12-02 08:24:09 24 4
gpt4 key购买 nike

我有如下输入文件,需要为每 3 列三元组执行此转换 col1*0 + col2*1 + col3*2

input.txt - 所有正数,可以是小数,真实文件有数千列。

0 0 0 1 0 0
0 1 0 0 0 1
0 0 1 0 0 0

我有下面的 gawk 行:

gawk '{for(i=1;i<=NF;i+=3)x=(x?x FS:"")(($(i+1))+($(i+2)*2));print x;x=y}' input.txt
0 0
1 2
2 0

此外,我需要检查 3 个数字是否全为零,如果全为零则转换应为 -9

伪代码:

if($i==0 & $(i+1)==0 & $(i+2)==0) {-9} else {$(i+1)+$(i+2)*2}
#or as all numbers are positive.
if(($i+$(i+1)+$(i+2))==0) {-9} else {$(i+1)+$(i+2)*2}

预期输出:

-9 0
1 2
2 -9

数据说明:此数据是从 IMPUTE2 输出的软件 - 基因型插补和单倍型定相程序。行是 SNP s,列是样本。每个 SNP 由 3 列表示。每个 SNP 有 3 个数字,范围为 0-1(等位基因 AA AB BB 的概率)。所以在上面的例子中我们有 3 个 SNP 和 2 个样本。插补也可以表示为剂量值,每个 SNP 1 个数字,范围为 0-2。我们正在尝试将概率格式转换为剂量格式。当 IMPUTE2 不能给任何等位基因任何概率时,它输出为 0 0 0,那么我们应该转换为 no call -9

最佳答案

如果给定的三个列为 0,您希望总和不同。为此,您可以将三元运算符扩展为类似的东西>

gawk '{ for(i=1;i<=NF;i+=3) {
x=$(i+1) + $(i+2)*2; # the sum
res=res (res ? FS : "") ($i==0 && $(i+1)==0 && $(i+2)==0 ?-9:x)
}
print res; res="" # print stored line and empty for next loop
}' file

也就是说,如果所有元素都是0,则附加值-9。否则,计算出的x:

res=res (res ? FS : "") ($i==0 && $(i+1)==0 && $(i+2)==0 ?-9:x)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^
if three columns are 0..........|

如果所有值都是正数,则可以重新格式化检查以仅比较总和是否为 0

($i + $(i+1) + $(i+2)) ? x : -9

用你的文件测试显然有效:

$ gawk '{for(i=1;i<=NF;i+=3) {x=$(i+1) + $(i+2)*2; res=res (res ? FS : "") ($i==0 && $(i+1)==0 && $(i+2)==0 ?-9:x)} print res; res=""}' file
-9 0
1 2
2 -9

关于for-loop - for 循环中的 If 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806143/

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