【问题标题】:Replace entire field based on another field using gsub in awk在 awk 中使用 gsub 基于另一个字段替换整个字段
【发布时间】:2017-07-12 23:34:45
【问题描述】:

我有一个名为 data.txt 的制表符分隔文件,如下所示:

A       A/A     ATTAA/A      
GT      G/G     GT/GT   
T       T/TATATA   T/T

如果整个字段与表单 column1field/column1field 匹配,我想用 REP 替换第 2-3 列中的字段。像这样:

A       REP     ATTAA/A      
GT      G/G     REP   
T       T/TATATA   REP

到目前为止,我有:

awk '{ gsub($1"/"$1,"REP",$0); print $0 }' data.txt

这很接近,但会在部分字段匹配时进行替换。像这样:

A       REP     ATTAREP      
GT      G/G     REP   
T       REPATATA   REP

我想合并 ^ 和 $ 但是这个:

awk '{ gsub(/^/$1"/"$1/$/,"REP",$0); print $0 }' data.txt

不工作。

任何帮助将不胜感激!

【问题讨论】:

    标签: awk


    【解决方案1】:

    我会使用这样的 for 循环:

    awk '{for(i=2;i<=NF;i++){if($i==$1"/"$1){$i="REP"}}}1' file
    

    解释:

    {
        # NF holds the number of fields in the record
        for(i=2;i<=NF;i++){
            if($i==$1"/"$1){
                $i="REP"
            }
        }
    }
    
    1 # Evaluates to true. awk will print the line
    

    【讨论】:

    • 迟到了几秒钟,但由于只有 2 列而避免了循环,应该是 ++
    【解决方案2】:

    我确信这个Awk 可以被简化,以它目前的形式工作,

    awk -F$'\t' 'BEGIN {OFS = FS} { if ($2 == $1"/"$1 || $3 == $1"/"$1) {gsub($1"/"$1,"REP",$2); gsub($1"/"$1,"REP",$3)} }1' data.txt
    
    A REP ATTAREP
    GT G/G REP
    T REPATATA REP
    

    【讨论】:

    • 如果 gsub 使用的模式在字段边界上正确匹配,if 检查将是多余的。
    • @hek2mgl:没错,在看到你的好方法后,现在删除它!
    • 好吧,你可以保留它。我只会匹配字段边界
    • 这很有帮助。谢谢。
    • @AkshayHegde:同意我意识到这不是最好的努力,可以按照您的建议或hek2mgl 回答的那样简单地完成。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2010-11-13
    • 2015-01-02
    相关资源
    最近更新 更多