2017-02-22 64 views
3

使用GSUB另一場整場我有一個名爲data.txt中像這樣的製表符分隔文件:替換基於在AWK

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

我想用2-3 REP如果替換字段列整個字段與表格column1field/column1field相匹配。就像這樣:

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 

不起作用。

任何幫助將不勝感激!

回答

3

我會用一個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 
+0

剛剛遲到了幾秒鐘,避免了由於只有2列的循環,應該是'++' – Inian

+0

我認爲這樣會很好 - 謝謝! – Kate

+0

歡迎您 – hek2mgl

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 
+1

如果gsub使用的模式在字段邊界上匹配正確,那麼'if'檢查將是多餘的。 – hek2mgl

+0

@ hek2mgl:確切地說,現在刪除它,看到你的好方法後! – Inian

+1

那麼,你可以保留它。我只是在場地邊界上匹配 – hek2mgl