【问题标题】:Replace fields with values of other fields in the same line将字段替换为同一行中其他字段的值
【发布时间】:2013-08-08 02:10:35
【问题描述】:

我有这样的输入:

rs10000004 C T 4 rs10000004 0 75625312 C C C C T 0 C T 
rs10000005 G A 4 rs10000005 0 75625355 G 0 A A A G A A 

如果列中的值与第二个字段 $2 相同,我想用“A”替换从 8 到结尾的列,如果该值与第三个字段 $3 相同,我想用“B”替换。否则,将按原样打印该值(某些列中应为零值)

预期输出

rs10000004 C T 4 rs10000004 0 75625312 A A A A B 0 A B 
rs10000005 G A 4 rs10000005 0 75625355 A 0 B B B A B B 

我尝试了以下方法,但它没有给我任何结果,只是空行。改进我的代码比向我展示使用 awk 以外的其他东西的新解决方案更好

cat input | awk '{ for(i=8; i<=NF; i++) { if($i == $2) $i="A"; else if($i == $3) $i="B"; else $i == 0; } print $i }'

提前致谢

【问题讨论】:

    标签: awk gawk nawk


    【解决方案1】:

    代码

    awk '
    {
        for (i=8; i<=NF; i++) {
           if ($i == $2) {
               $i = "A";
           }
           else {
               if ($i == $3) {
                   $i = "B";
               }
               else {
                   $i = 0;
               }
           }
        }
        print;        
    }' input
    

    或更短:

    awk '
    {
        for (i=8; i<=NF; i++) {
           if ($i == $2)
               $i="A";
           else
               if ($i == $3)
                   $i="B";
               else
                   $i = 0;
        }
    }
    1' input
    

    输出

    rs10000004 C T 4 rs10000004 0 75625312 A A A A B 0 A B 
    rs10000005 G A 4 rs10000005 0 75625355 A 0 B B B A B B 
    

    【讨论】:

    • 将循环更改为从i=8 开始并删除if 语句。
    • 好的,所以它可以工作,但我犯了一个错误,你可能也有它在最后一个 else { $i =0 } 而不是 $i == 0 之后对吗?
    • 可以更短,使用三元运算符:awk '{for(i=8;i&lt;=NF;i++) $i = ($i==$2) ? "A" : ($i==$3) ? "B" : 0}1' input
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2021-05-23
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多