Все учебники CSV to TSV предлагают простое:
tr ',' '\t'
, хотя некоторые CSV выглядят так:
1,310,"IntAct,PINA"
, и в этом случае я бы хотел сохранить "IntAct,PINA"
:
1 310 "IntAct,PINA"
Как я могу параметризовать команду tr
(или sed
и т. Д.), Чтобы сделать это?
Я ценю любые предложения.
Используйте csvformat
из csvkit
:
csvformat -d, -D или короче:
csvformat -T file
-d
входной разделитель (не требуется) здесь, поскольку ,
является входным разделителем по умолчанию)
-D
выходной разделитель
-T
устанавливает вкладки в качестве выходного разделителя
Он удалит цитаты, так как они не нужны для tsv
.
Вы сможете установить csvkit
через pip
:
sudo apt install python-pip
pip install csvkit
\t' file
или короче:
csvformat -T file
-d
входной разделитель (не требуется) здесь, поскольку,
является входным разделителем по умолчанию)
-D
выходной разделитель
-T
устанавливает вкладки в качестве выходного разделителя
Он удалит цитаты, так как они не нужны для tsv
.
Вы сможете установить csvkit
через pip
:
sudo apt install python-pip
pip install csvkit
Использование CSV без заголовка
1,310,"IntAct,PINA"
и Миллер ( https://github.com/johnkerl/miller )
mlr --nidx --ifs "," --ofs "\t" cat input.csv
возвращают вас
1 310 "IntAct PINA"
Если csvkit
(который я рекомендую), не доступно, затем Вы могли использовать текст жемчуга:: модуль 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($_)