2012-05-02 5 views
4

У меня есть текстовый файл, и я пытаюсь заменить конкретный символ (.) В первом столбце на другой символ (-). Каждое поле делится запятой. Некоторые из строк содержат три последних столбца, поэтому в конце они содержат 3 запятые.Замена определенных символов в первом столбце текста

Пример текстового файла:

abc.def.ghi,123.4561.789,ABC,DEF,GHI 
abc.def.ghq,124.4562.789,ABC,DEF,GHI 
abc.def.ghw,125.4563.789,ABC,DEF,GHI 
abc.def.ghe,126.4564.789,,, 
abc.def.ghr,127.4565.789,,, 

То, что я пытался использовал AWK заменить '' в первом столбце с '-', затем распечатайте содержимое.

ETA: Пробовал предложение sarnold и получил выход, который я хочу.

ETA2: У меня может быть более длинная первая колонка. Есть ли способ изменить ТОЛЬКО первые 3 '.' в первом столбце «-», так что я получить выход

abc-def-ghi-qqq.www,123.4561.789,ABC,DEF,GHI 
abc-def-ghq-qqq.www,124.4562.789,ABC,DEF,GHI 
abc-def-ghw-qqq.www,125.4563.789,ABC,DEF,GHI 
abc-def-ghe-qqq.www,126.4564.789,,, 
abc-def-ghr-qqq.www,127.4565.789,,, 

ответ

7

. является регулярным выражением для обозначения «любого символа». Избежать его с \ и это означает .:

$ awk -F, '{gsub(/\./,"-",$1); print}' textfile.csv 
abc-def-ghi 123.4561.789 ABC DEF GHI 
abc-def-ghq 124.4562.789 ABC DEF GHI 
abc-def-ghw 125.4563.789 ABC DEF GHI 
abc-def-ghe 126.4564.789 
abc-def-ghr 127.4565.789 
$ 

Выходной разделитель полей представляет собой пространство, по умолчанию. Установить OFS = "," установить, что:

$ awk -F, 'BEGIN {OFS=","} {gsub(/\./,"-",$1); print}' textfile.csv 
abc-def-ghi,123.4561.789,ABC,DEF,GHI 
abc-def-ghq,124.4562.789,ABC,DEF,GHI 
abc-def-ghw,125.4563.789,ABC,DEF,GHI 
abc-def-ghe,126.4564.789,,, 
abc-def-ghr,127.4565.789,,, 

Это все еще позволяет изменять несколько полей:

$ awk -F, 'BEGIN {OFS=","} {gsub(/\./,"-",$1); gsub("1", "#",$2); print}' textfile.csv 
abc-def-ghi,#23.456#.789,ABC,DEF,GHI 
abc-def-ghq,#24.4562.789,ABC,DEF,GHI 
abc-def-ghw,#25.4563.789,ABC,DEF,GHI 
abc-def-ghe,#26.4564.789,,, 
abc-def-ghr,#27.4565.789,,, 

Я не знаю, что -OFS,делает, но это не поддерживается опция командной строки; использование его для установки разделителя выходного поля было ошибкой с моей стороны. Установка OFS в программе awk работает хорошо.

+0

Спасибо! Я попробовал ваше предложение и добавил его в свой оригинальный пост. – Rayne

+0

Hunh, почему добавление '-OFS 'фактически изменило вывод для второго столбца? – sarnold

+0

Хмм, я не знаю, но я получил результат, который я хотел, и второй столбец не был изменен. – Rayne

3

Это может работать для вас:

awk -F, -vOFS=, '{for(n=1;n<=3;n++)sub(/\./,"-",$1)}1' file 
abc-def-ghi-qqq.www,123.4561.789,ABC,DEF,GHI 
abc-def-ghq-qqq.www,124.4562.789,ABC,DEF,GHI 
abc-def-ghw-qqq.www,125.4563.789,ABC,DEF,GHI 
abc-def-ghe-qqq.www,126.4564.789,,, 
abc-def-ghr-qqq.www,127.4565.789,,,