For loop If运算符在for循环中

For loop If运算符在for循环中,for-loop,awk,bioinformatics,For Loop,Awk,Bioinformatics,我有如下的输入文件,需要对每3列三元组执行此转换col1*0+col2*1+col3*2 input.txt-所有正数都可以是小数,实际文件有1000列 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 我有下面这句话: 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 预期产出: -9 0 1 2 2 -9 数据描述:

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

input.txt-所有正数都可以是小数,实际文件有1000列

0 0 0 1 0 0
0 1 0 0 0 1
0 0 1 0 0 0
我有下面这句话:

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
预期产出:

-9 0
1 2
2 -9
数据描述:
该数据由软件输出——基因型插补和单倍型分阶段程序。行是示例,列是示例。每个SNP由3列表示。每个SNP有3个数量,范围为0-1(等位基因AA-AB-BB的概率)。在上面的例子中,我们有3个SNP和2个样本。插补也可以表示为剂量值,每个SNP 1个数字,范围为0-2。我们正试图将概率形式转换成剂量形式。当IMPUTE2不能为任何等位基因提供任何概率时,它输出为
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

($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

$gawk'{for(i=1;i另一个
awk
一个线性(假设输入值为非负)


所以如果你只是乘以零,那么忽略第1列和第4列是安全的,对吗?@ghoti是的,我在现有的gawk解决方案中也忽略了它们。
$(I+1))+($(I+2)*2
我还没有测试它,如果实际数据中的列数是1000,这会起作用吗?另外,不要依赖于假设
c1 | |$1
等于零意味着$1、$2、$3都是零。例如,$2==2和$3==-1意味着结果是合法的零。是的,零测试用于零或其他。计算值使用两个字段和”“或者"使用未使用的字段填充将指示所有字段是零还是任何非零。假设数据是非负值,我以为已指定,但不再确定。非负值已从规范中编辑掉!如果可以使用负值,则不正确,因为它们可能相互抵消。这不是仅为ini设置的循环构造tial 6列。该逻辑仅适用于非负值。能否在第3行添加更多详细信息?什么是
意思?@zx8754
var=condition?“如果为真”:“如果为假”
是三元运算符。例如,您可以说
x=(var>0)?var:-var
使
x
包含
var
无符号。谢谢,将
$i==0&&$(i+1)==0&&$(i+2)==0
转换为
$($i+$(i+1)+$(i+2))==0
会更有效吗?(取总和并检查是否为0)。@zx8754如果所有正数都是,但如果
$i==1
$i+1怎么办==0
$(i+2)==-1
?总和是0,而两个不是。@zx8754没问题!刚刚更新了我的答案,考虑到了这一点。
($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
$ awk '{c1=$2+2*$3;c2=$5+2*$6; print c1||$1?c1:-9,c2||$4?c2:-9}' lop
-9 0
1 2
2 -9