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

使用awk中的gsub替换基于另一个字段的整个字段,awk,Awk,我有一个以制表符分隔的文件,名为data.txt,如下所示: A A/A ATTAA/A GT G/G GT/GT T T/TATATA T/T awk '{for(i=2;i<=NF;i++){if($i==$1"/"$1){$i="REP"}}}1' file 如果整个字段与column1field/column1field格式匹配,我想用REP替换第2-3列中的字段。像这样: A REP

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

A       A/A     ATTAA/A      
GT      G/G     GT/GT   
T       T/TATATA   T/T
awk '{for(i=2;i<=NF;i++){if($i==$1"/"$1){$i="REP"}}}1' file
如果整个字段与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
不起作用


任何帮助都将不胜感激

我会使用这样的for循环:

A       A/A     ATTAA/A      
GT      G/G     GT/GT   
T       T/TATATA   T/T
awk '{for(i=2;i<=NF;i++){if($i==$1"/"$1){$i="REP"}}}1' file

awk'{for(i=2;i我确信这个
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
的回答简单地完成。