所有 CSV 到 TSV 教程都建议一个简单的方法:
tr ',' '\t'
尽管有些 CSV 看起来像这样:
1,310,"IntAct,PINA"
在这种情况下我想保留"IntAct,PINA"
:
1 310 "IntAct,PINA"
我怎样才能参数化tr
命令(或sed
等)才能做到这一点?
我感谢任何建议。
答案1
使用csvformat
自csvkit
:
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"