2013-09-26 1 views
7

Я хочу удалить точку (.) Только с 4-го и 5-го столбцов таблицы.Удалить точки (.) Из определенных столбцов с помощью gsub и awk

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 .  

Не могли бы вы указать, где я должен изменить? Спасибо заранее.

ответ

9

Когда вы используете строку для хранения RE (например, "\."), строка анализируется дважды - один раз, когда скрипт считывается awk, а затем снова выполняется при awk. В результате вам нужно дважды избегать метасимволов RE (например, "\\.").

Лучшим решением во всех отношениях является не указание RE как строки, а указание его как константы RE вместо использования соответствующих разделителей, например. /\./:

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

Красивые. Огромное спасибо. – jamie

+0

можно использовать: awk 'BEGIN {OFS = FS = "\ t"} {для (i = 4, i <= 5, ++ i); gsub (/\./,"",$ i) } 1 'вход – Vonton

+0

да, конечно. Если бы было занято более двух полей, то цикл был бы правильным. Это всего лишь 2 поля, это не имеет значения. –