CSV 转 TSV,无需替换引号内的逗号

CSV 转 TSV,无需替换引号内的逗号

所有 CSV 到 TSV 教程都建议一个简单的方法:

tr ',' '\t'

尽管有些 CSV 看起来像这样:

1,310,"IntAct,PINA"

在这种情况下我想保留"IntAct,PINA"

1   310 "IntAct,PINA"

我怎样才能参数化tr命令(或sed等)才能做到这一点?

我感谢任何建议。

答案1

使用csvformatcsvkit

csvformat -d, -D$'\t' file

或更短:

csvformat -T file

-d输入分隔符(这里不需要,因为,是默认的输入分隔符)

-D输出分隔符

-T将制表符设置为输出分隔符

它将删除引号,因为 不需要它们tsv


您应该可以csvkit通过以下方式安装pip

sudo apt install python-pip
pip install csvkit

答案2

如果csvkit(我推荐)不可用,那么您可以使用 perl文本::CSV模块:

perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new} print join "\t", $p->fields() if $p->parse($_)
' file

如果你坚持保留引号(这是不必要的,因为嵌入的,不再是分隔符),那么你可以这样做

print join "\t", map { $_ =~ s/.*,.*/"$&"/r } $p->fields() if $p->parse($_)

答案3

使用不带标题的 CSV

1,310,"IntAct,PINA"

和米勒(https://github.com/johnkerl/miller

mlr --nidx --ifs "," --ofs "\t" cat input.csv

给你回报

1       310     "IntAct PINA"

相关内容