仅在第 5 和第 6 字段中用#(哈希符号)替换字符

Replace a character with #(hash symble) only in 5th & 6th field

我正在尝试仅在第 5 和第 6 个字段中用 #(哈希符号)替换字符。 例如。我必须仅在第 5 个和第 6 个字段中将 'Z' 替换为“#”(使用 perl 或 AWK 脚本)。包含 'Z' 符号的剩余字段不应受到影响。

(只是我正在更新 post 以用 # 替换双引号 (") 而不是 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"

谢谢。

$ 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

这是完成这项工作的 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"

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

awk -F, -v OFS=, '{gsub(/Z/,"#",);gsub(/Z/,"#",)} 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(/\"/,"#",);gsub(/\"/,"#",)} 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"