作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有如下输入文件,需要为每 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/
我是一名优秀的程序员,十分优秀!