2017-04-04 85 views
1

我已經查看過所以發現了很多類似的東西,但這並不複雜,我只是不能似乎完全得到那裏... 我正在處理csv文本操作來自動執行任務。 我需要用溝通來代替溝通 - 闡明自己; 但是當字符串體育傳播,出現我不希望改變。我認爲它接近sed或awk匹配字符串的一部分

sed -i.bak "s/[Sports]! Communication,/Communication - articulating one\'s self;/g" out.csv 

我會被罰款與awk的解決方案,但更熟悉在bash文件sed的其所謂真正的任何命令行常見的解決方案將是巨大的

unassigned,2.5,"Sports Communication,","The Campus...lots of other data...will be required.",Communication,Collaboration,Brand 

通信可以與合作或品牌切換或不存在

+1

你能不能給我們的線看起來怎麼樣,即在單獨的行(或)逗號分隔 – Inian

+0

顯示輸入片段 – RomanPerekhrest

+0

添加csv片段 – brad

回答

3

您可以使用Awk聲明這樣,

awk -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file 

其下面產生一個輸出輸入文件

unassigned 2.5 "Sports Communication " "The Campus...lots of other data...will be required." Communication - articulating one's self; Collaboration Brand 

在最新的GNU awk中(因爲4.1.0 released),它具有"inplace" file editing的選項:

[...]的「就地「使用新設施構建的擴展可用於模擬GNU」sed -i「功能。 [...]

,並保持文件的備份與擴展需要

gawk -i inplace -v INPLACE_SUFFIX=.bak -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file 

(或)爲舊版本,只需使用一個臨時文件,交換回來,

基於下面的一個和最唯一埃德莫頓的意見直接做替代,避免簡單化的
awk -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file > temp && mv temp > file 

一級別的非必要match()

awk -F\, '{for(i=1;i<=NF;i++) {sub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }1' file 
+0

爲什麼'匹配($ i,/^Communication $ /)'而不是'$ i ==「通訊」'?爲什麼要搜索它然後改變它而不是隻是試圖改變它?爲什麼用gsub()代替sub()來替換1個可能的?最後 - 由於字段內的字符串可以包含逗號(請參閱發佈的示例輸入),因此此解決方案無法穩健運行,因此您需要基於awk的解決方案使用FPAT。 –

+1

@EdMorton:像往常一樣欣賞你的寶貴意見,我想我需要做很多改變。我在'FPAT'解決方案中輸了。也許你可以自己發佈一個 – Inian

+1

我通常只是在已經選擇了答案的時候跳過它,因爲OP已經推遲了,而且將來看到的任何人都只關注接受的答案,所以在這一點上發佈解決方案。基本上,您需要使用'FPAT =「([^,] *)|(\」[^ \「] + \」)「'而不是'FS =」,「'用awk解析CSV文件,它只能在GNU awk中工作,這就是說a,b,c,d被解析爲3個字段'','<"b,c">'和''而不是4'','<"b>',' '和''。請參閱https://www.gnu.org/software/gawk/manual/gawk.html#Splitting-By-Content以獲取更多信息。 –