AWK:用引号替换带引号的字符串中的逗号并删除引号

时间:2014-03-28 10:37:28

标签: unix awk

数据:

的1.txt

-1,"AAA",aaa@ymail
-10,"B ,BB","b, bb@ymail"
-7,C,c@gmail

我想 1.使用下划线删除带引号的字符串中的逗号 2.之后删除引号

我在下面使用:

awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub("[,]", "_", $i) } 1' 1.txt > 2.txt

输出:(请注意,由于没有逗号,因此未删除第一行[“AAA”]

-1,"AAA",aaa@ymail
-10,"B ,BB",b_ bb@ymail
-7,C,c@gmail

另外我使用

awk -F'"' -v OFS='' '{ for (i=1; i<=NF; i+=1) } 1' 2.txt > 3.txt

-1,AAA,aaa@ymail
-10,"B ,BB",b_ bb@ymail
-7,C,c@gmail

请建议更好的方法来执行上述操作

2 个答案:

答案 0 :(得分:2)

我选择一种带有正确CSV解析器的语言。例如,ruby:

ruby -r csv -ne '
  row = CSV.parse_line($_).collect {|f| f.gsub(/,/,"_")}
  puts CSV.generate_line(row)
' <<END
-1,"AAA",aaa@ymail
-10,"B ,BB","b, bb@ymail"
-7,C,c@gmail
END
-1,AAA,aaa@ymail
-10,B _BB,b_ bb@ymail
-7,C,c@gmail

答案 1 :(得分:1)

如果添加$1=$1命令,输出将被拆分并重新合并,因此字段分隔符不会出现在输出中。

$ awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub("[,]", "_", $i);$1=$1 } 1' file
-1,AAA,aaa@ymail
-10,B _BB,b_ bb@ymail
-7,C,c@gmail