2017-04-04 95 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以获取更多信息。 –