2012-05-02 35 views
4

我有一個文本文件,我試圖將第一列中的特定字符(。)替換爲另一個字符( - )。每個字段都以逗號分隔。有些行最後3列是空的,所以最後有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,,但它不是一個支持的命令行選項;使用它來設置輸出字段分隔符是我的錯誤。在awk程序中設置OFS運行良好。

+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,,, 
相關問題