更改非常规 CSV 中的分隔符

use*_*454 0 unix shell awk sed

我有以下 CSV 文件:

ID,COUNTRY,DESCRIPTION,PRICE
1,USA,Short description,11
2,UK,"Description with comma , inside",2.3
Run Code Online (Sandbox Code Playgroud)

因此,如果字段包含逗号,则将其放在双引号中。

如何将分隔符从逗号替换为制表符但忽略引号中的逗号?所以我会有:

ID    COUNTRY    DESCRIPTION    PRICE
1    USA    Short description    11
2    UK    "Description with comma , inside"    2.3
Run Code Online (Sandbox Code Playgroud)

或不带双引号:

ID    COUNTRY    DESCRIPTION    PRICE
1    USA    Short description    11
2    UK    Description with comma , inside    2.3
Run Code Online (Sandbox Code Playgroud)

在我注意到某些字段包含逗号之前,我使用了此代码:

$VAR='\t'
sed -i $"s/,/$VAR/" $FILE_NAME
Run Code Online (Sandbox Code Playgroud)

Rav*_*h13 5

对于 GNU awk,您能否尝试使用所示示例编写以下内容(如果您想在 Input_file 本身中进行编辑,则也可以附加 > temp && mv temp Input_file以下解决方案)。

awk -v FPAT='[^,]*|"[^"]+"' -v OFS="\t" '{$1=$1}1' Input_file
Run Code Online (Sandbox Code Playgroud)

"从行的字段的开头和结尾删除,然后运行以下内容。

awk -v FPAT='[^,]*|"[^"]+"' -v OFS="\t" '
{
  for(i=1;i<=NF;i++){
    gsub(/^"|"$/,"",$i)
  }
  $1=$1
}
1
' Input_file
Run Code Online (Sandbox Code Playgroud)