使用gsub和awk从特定列中删除点(。)

时间:2013-09-26 19:16:00

标签: unix awk gsub

我只想从表格的第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   .       

你能指出我要修改的地方吗? 提前谢谢。

1 个答案:

答案 0 :(得分:10)

当您使用字符串来保存RE(例如"\.")时,字符串将被解析两次 - 一次是在awk读取脚本时,然后在由awk执行时再次解析。结果是您需要两次转义RE元字符(例如"\\.")。

在各方面更好的解决方案是不将RE指定为字符串,而是将其指定为RE常量,而不是使用适当的分隔符,例如/\./

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