8

表の 4 列目と 5 列目のみドット (.) を削除したい。

input
1    10057   .       A       AC      
1    10146   .       AC.      A       
1    10177   .       A       AC      
1    10230   .       AC      .A,AN    
1    10349   .       CCCTA   C,CCCTAA.              
1    10389   .       .AC      A,AN



desired output
1    10057   .       A       AC      
1    10146   .       AC      A       
1    10177   .       A       AC      
1    10230   .       AC      A,AN    
1    10349   .       CCCTA   C,CCCTAA              
1    10389   .       AC      A,AN    

そこで、次のコマンドを試しました。

awk 'BEGIN {OFS=FS="\t"} {gsub("\.","",$4);gsub("\.","",$5)}1' input

この結果が得られました (4 番目と 5 番目の列全体が削除されました)。

1    10057   .          
1    10146   .            
1    10177   .        
1    10230   .       
1    10349   .                 
1    10389   .       

どこを変更する必要があるか教えてください。前もって感謝します。

4

1 に答える 1

14

文字列を使用して RE を保持する場合 (例: "\.")、文字列は 2 回解析されます。1 回目はスクリプトが awk によって読み取られるとき、2 回目は awk によって実行されるときです。その結果、RE メタ文字を 2 回エスケープする必要があります (例: "\\.")。

あらゆる点でより良い解決策は、RE を文字列として指定するのではなく、適切な区切り文字を使用して RE 定数として指定することです。たとえば、次のようになり/\./ます。

awk 'BEGIN {OFS=FS="\t"} {gsub(/\./,"",$4);gsub(/\./,"",$5)}1' input
于 2013-09-26T19:22:27.910 に答える