gpt4 book ai didi

awk - 根据匹配条件注释每隔一列

转载 作者:行者123 更新时间:2023-12-05 09:37:01 26 4
gpt4 key购买 nike

我有一个制表符删除文件

NC_044998.1     4013    0       TT      2       GG      0       TT      0       TT      0       TT      
NC_044998.1 4016 0 TT 0 TT 0 TT 2 GG 0 TT
NC_044998.1 4018 0 TT 0 TA 0 TT 0 TT 0 TT
NC_044998.1 4019 2 CG 2 CC 2 CC 2 CG 2 CC

我需要比较每隔一列的两个字母

如果匹配添加“homo”,否则添加“het

每次比较的结果都可以附加到最后一列,如下面的输出。

    NC_044998.1     4013    0       TT      2       GG      0       TT      0       TT      0       TT  homo homo homo homo homo  
NC_044998.1 4016 0 TT 0 TT 0 TT 2 GG 0 TT homo homo homo homo homo
NC_044998.1 4018 0 TT 0 TA 0 TT 0 TT 0 TT homo het homo homo homo
NC_044998.1 4019 2 CG 2 CC 2 CC 2 CG 2 CC het homo homo het homo

另一个例子

NC_044998.1     3803    0       GG      1       GA      0       GG      1       GA      1       GA      0       GG      0       GG      var     heterozygous    varvar  8       0.727273        3       0.272727
NC_044998.1 3806 0 TT 1 TA 1 TA 0 TT 0 TT 0 TT 0 TT var heterozygous varvar 9 0.818182 2 0.181818

输出为

NC_044998.1     3803    0       GG      1       GA      0       GG      1       GA      1       GA      0       GG      0       GG      var     heterozygous    varvar  8       0.727273        3       0.272727 homo het homo het het homo homo
NC_044998.1 3806 0 TT 1 TA 1 TA 0 TT 0 TT 0 TT 0 TT var heterozygous varvar 9 0.818182 2 0.181818 homo het het homo homo homo homo

尝试过

awk 'BEGIN {FS=OFS="\t"} {for (i=4; length($i)==2 && i<=12; i+=2) substr($i,1,1) == substr($i,2,1); print $0, "homo"}'

awk 'BEGIN {FS=OFS="\t"} { for (i=4; i<=NF; i+=2); for (j=1; j<=2; ++j); $0 = $0 " " (substr($i,j,1) == substr($i,2,1) ? "homo" : "het")} 1'

但两者都只会在每行的末尾打印“homo

最佳答案

编辑:因为 OP 的要求现在在添加更多样本后变得更加清晰,但我的第一个答案也保留在这里。

awk '
{
for(i=4;i<=NF;i+=2){
if(length($i)==2){
if(substr($i,1,1) == substr($i,2,1)){
val=(val?val OFS:"")"homo"
}
else{
val=(val?val OFS:"")"het"
}
}
}
printf("%s%s\n",$0,(val!=""?OFS val:""))
val=""
}' Input_file

或者如果你不想打印那些没有字段有 2 个字母长度的行(基本上没有 homohet 的值)并且你想跳过打印的那一行然后执行以下操作。

awk '
{
for(i=4;i<=NF;i+=2){
if(length($i)==2){
if(substr($i,1,1) == substr($i,2,1)){
val=(val?val OFS:"")"homo"
}
else{
val=(val?val OFS:"")"het"
}
}
}
if(val!=""){
print $0,val
}
val=""
}' Input_file


您能否尝试按照您显示的示例编写以下内容。你的 Input_file 在我看来没有制表符分隔,以防它的制表符分隔添加一个 BEGIN 部分,比如 BEGIN{FS=OFS="\t"} after awk '`以下解决方案中的行。

awk  '
{
for(i=6;i<=NF;i+=2){
if($i==$(i-2)){
val=(val?val OFS:"")"homo"
}
else{
val=(val?val OFS:"")"het"
}
}
print $0,val
val=""
}' Input_file

说明: 为以上添加详细说明。

awk  '                                ##Starting awk program from here.
{
for(i=6;i<=NF;i+=2){ ##Starting a for loop from 6th field to last field which will go every 2nd field from 6th one.
if($i==$(i-2)){ ##Checking condition if current field is equals to current-2 field value.
val=(val?val OFS:"")"homo" ##if its equal then add homo in val variable here and keep appending value to it.
}
else{ ##else part, in case current field is NOT equal to current-2 field then do following.
val=(val?val OFS:"")"het" ##if its NOT equal then add net to val value here.
}
}
print $0,val ##Printing current line and val when for loop is completed here.
val="" ##Nullifying val here.
}' Input_file ##Mentioning Input_file name here.

关于awk - 根据匹配条件注释每隔一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64584822/

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