使用awk中的gsub替换基于另一个字段的整个字段

时间:2017-02-22 18:36:35

标签: awk

我有一个名为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

不起作用。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

我会像这样使用for循环:

select 
    t.*, 
    @rn := if(@group_id = group_id,
                @rn + 1,
                if(@group_id := group_id, 1, 1)
            ) increment_id
from (
    select group_id
    from your_table t
    /* some where clauses */
    order by group_id
    ) t
cross join (
    select @rn := 0,
        @group_id := - 1
    ) t2

说明:

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

答案 1 :(得分: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
相关问题