Shell 更改非常规CSV中的分隔符

Shell 更改非常规CSV中的分隔符,shell,unix,awk,sed,Shell,Unix,Awk,Sed,我有以下CSV文件: ID,COUNTRY,DESCRIPTION,PRICE 1,USA,Short description,11 2,UK,"Description with comma , inside",2.3 所以,若字段包含逗号,那个么它将被放在双引号中 如何将分隔符从逗号替换为制表符,但忽略引号中的逗号?因此,我将: ID COUNTRY DESCRIPTION PRICE 1 USA Short description 1

我有以下CSV文件:

ID,COUNTRY,DESCRIPTION,PRICE
1,USA,Short description,11
2,UK,"Description with comma , inside",2.3
所以,若字段包含逗号,那个么它将被放在双引号中

如何将分隔符从逗号替换为制表符,但忽略引号中的逗号?因此,我将:

ID    COUNTRY    DESCRIPTION    PRICE
1    USA    Short description    11
2    UK    "Description with comma , inside"    2.3
或不带双引号:

ID    COUNTRY    DESCRIPTION    PRICE
1    USA    Short description    11
2    UK    Description with comma , inside    2.3
在注意到某些字段包含逗号之前,我使用了此代码:

$VAR='\t'
sed -i $"s/,/$VAR/" $FILE_NAME

使用GNU
awk
,您是否可以尝试使用显示的示例编写以下内容(如果您希望在输入文件本身中进行编辑,请在以下解决方案中附加
>temp&&mv temp输入文件

或者从行的字段开始和结束处删除
,然后运行以下命令

awk -v FPAT='[^,]*|"[^"]+"' -v OFS="\t" '
{
  for(i=1;i<=NF;i++){
    gsub(/^"|"$/,"",$i)
  }
  $1=$1
}
1
' Input_file
awk-vfpat='[^,]*|“[^”]+'-vofs=“\t”'
{
对于(i=1;iRuby有一个很好的:

ruby-rcsv-e'
out=CSV.new($stdout,col\u sep:“\t”)
CSV.foreach(ARGV.shift){| row | out这可能适合您(GNU-sed):

将双引号内的所有逗号转换为换行符,将剩余的逗号转换为制表符(或其他形式),然后将换行符转换回逗号


注意:如果新分隔符是换行符或双引号中有双引号,则此操作无效。

因此,强烈建议在问题中添加努力。因此,请在问题中以代码形式添加努力,然后让我们知道。这是错误的,请编辑查看
csvkit
工具。您不需要转换吗将数据中的abs改为空格或其他内容,这样您就不会得到比开始时更多的字段?另请参阅。感谢您的回答,FPAT看起来正是我所需要的…不幸的是,它在我们的系统中不起作用,因为我们安装了较低的awk(<4.0)@user1632454,请确保没有问题。干杯,学习愉快。@user1632454您应该更新您的gawk版本,因为您已经过时10年了,缺少一些错误修复和大量非常有用的新功能。
awk -v FPAT='[^,]*|"[^"]+"' -v OFS="\t" '
{
  for(i=1;i<=NF;i++){
    gsub(/^"|"$/,"",$i)
  }
  $1=$1
}
1
' Input_file
sed -E ':a;s/^([^"]*("[^",]*"[^"]*)*"[^"]*),/\1\n/;ta;y/,/\t/;y/\n/,/' file