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

Unix AWK:用下划线替换带引号字符串中的逗号并删除引号,unix,awk,Unix,Awk,数据: 1.txt 我想 1.删除带下划线的带引号字符串中的逗号 2.在那之后也删除引号 我现在使用的是: awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub("[,]", "_", $i) } 1' 1.txt > 2.txt 所以另外我用 awk -F'"' -v OFS='' '{ for (i=1; i<=NF; i+=1) } 1' 2.txt > 3.txt -1,AAA,aaa@ymail -10,"B

数据:

1.txt

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

我现在使用的是:

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

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

awk-F'''-v OFS=''{for(i=1;i如果添加
$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

$awk-F'''-vofs='''{for(i=2;i我会选择一种带有适当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

最简单的解决方法是停止认为逗号分隔的数据是分隔数据唯一有效的形式。AWK和UNIX一般假定数据分隔符将只作为数据分隔符出现,而不是作为数据值。考虑用标签或“字符”导出数据。祝您好运。谢谢USER090001起作用。谢谢解释。
$ 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
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