仅在第5和第5版中用#(hash symble)替换字符。第6场

时间:2015-03-05 12:39:05

标签: perl replace awk

我试图仅在第5和第5版中用#(hash symble)替换字符。第6场。 例如。我必须在第5和第5版中用'#'替换'Z'。第6个字段(使用perl或AWK脚本)。其余字段包含'Z'符号不应受到影响。

(只是我正在更新帖子以用#替换双引号(“)而不是Z.我可以实现这个吗?感谢宝贵的帮助) 例如:i / p文件:

aa",bb,ccc,ddd,eee",ddd",fff
aa1",ba1,ccc1,"ddd1,eee"1,ddd1,fff1
z,aa2,bb2",ccc2,ddd2","eee2",ddd2,fff2"

预期的O / p文件:

aa",bb,ccc,ddd,eee#,ddd#,fff
aa1",ba1,ccc1,#ddd1,eee#1,ddd1,fff1
aa2,bb2",ccc2,ddd2#,#eee2#,ddd2,fff2"

感谢。

3 个答案:

答案 0 :(得分:1)

$ awk 'BEGIN{FS=OFS=","} {for (i=5;i<=6;i++) gsub(/Z/,"#",$i)} 1' file
x,aaZ,bb,ccc,ddd,eee#,dddZ,fff
y,aa1Z,ba1,ccc1,#ddd1,eee#1,ddd1,fff1
z,aa2,bb2Z,ccc2,ddd2#,#eee2,ddd2,fff2Z

答案 1 :(得分:0)

这是Perl的工作方式:

perl -anF, -e '$"=","; s/Z/#/ for (@F)[4,5];print"@F";' < in1.txt 

如果某个字段中有多个Z,则可以使用:

perl -anF, -e '$"=","; s/Z/#/g for (@F)[4,5];print"@F";' < in1.txt 

<强>输出:

aaZ,bb,ccc,ddd,eee#,ddd#,fff
aa1Z,ba1,ccc1,Zddd1,eee#1,ddd1,fff1
aa2,bb2Z,ccc2,ddd2Z,#eee2,ddd2,fff2Z

根据评论进行编辑:

in1.txt

aa",bb,ccc,ddd,eee",ddd",fff
aa1",ba1,ccc1,"ddd1,eee"1,ddd1,fff1
aa2,bb2",ccc2,ddd2","eee2,ddd2,fff2"

命令:

perl -anF'','' -e '$"=",";s/"/#/ for (@F)[4,5];print"@F";' < in1.txt 

结果:

aa",bb,ccc,ddd,eee#,ddd#,fff
aa1",ba1,ccc1,"ddd1,eee#1,ddd1,fff1
aa2,bb2",ccc2,ddd2",#eee2,ddd2,fff2"

答案 2 :(得分:0)

由于它只有两个字段,所以可以省略循环。

awk -F, -v OFS=, '{gsub(/Z/,"#",$5);gsub(/Z/,"#",$6)} 1' file
x,aaZ,bb,ccc,ddd,eee#,dddZ,fff
y,aa1Z,ba1,ccc1,#ddd1,eee#1,ddd1,fff1
z,aa2,bb2Z,ccc2,ddd2#,#eee2,ddd2,fff2Z

在第五和第六栏中替换"

awk -F, -v OFS=, '{gsub(/\"/,"#",$5);gsub(/\"/,"#",$6)} 1' file
aa",bb,ccc,ddd,eee#,ddd#,fff
aa1",ba1,ccc1,"ddd1,eee#1,ddd1,fff1
z,aa2,bb2",ccc2,ddd2#,#eee2#,ddd2,fff2"