仅在第 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"
我正在尝试仅在第 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"