cat bash 命令将制表符转换为逗号分隔并用双引号引起来

cat bash command to convert tab to comma delimited and wrap in double quotes

我有以下数据(作为例子)

name    street    suburb
Todd Man    14 Streety Road    Townsville
Cheryl Lady 15 Roady Street    Villatown
Girl, Sara  16 Circus Circuit  Groundston

并使用此命令从制表符分隔转换为逗号分隔的 csv

cat customers.csv | tr '[\t]' '[,]' > customers_comma.csv

然后输出

name,street,suburb
Todd Man,14 Streety Road,Townsville
Cheryl Lady,15 Roady Street,Villatown
Girl, Sara,16 Circus Circuit,Groundston

但是 Girl, Sara 正在添加一个额外的列。我怎样才能使输出为

name,street,suburb Todd Man,14 Streety Road,Townsville Cheryl Lady,15 Roady Street,Villatown "Girl, Sara",16 Circus Circuit,Groundston

看起来很简单,但是用谷歌搜索了这个问题却找不到解决方案。

我不必使用 cat 但如果有一行 bash 命令就可以做到这一点。

您可以试试下面的 sed 命令。

$ sed 's/\([^[:space:],]\+, *[^[:space:]]\+\)/""/g;s/\t/,/g' file
name,street,suburb
Todd Man,14 Streety Road,Townsville
Cheryl Lady,15 Roady Street,Villatown
"Girl, Sara",16 Circus Circuit,Groundston

其中 [^[:space:],]\+ 匹配任何字符,但不匹配 space 或逗号一次或多次。

这里有一个 awk 的小解决方案:

awk 'BEGIN{FS="\t";OFS=",";Q="\""}
          {for (i=1;i<=NF;++i)
             if ($i ~ /[",]/)
               $i = Q gensub(/"/,Q Q,"g",$i) Q
          }
          { = }
     1' file.txt 

如果在字段中找到引号,它也会加倍引号。