2013-11-29 6 views
2

У меня есть CSV с 130 колонами, и мне нужно сделать 3 csv с этим. Я немного зацикливаюсь и IFS, потому что мне нужно делать что-то с варами в каждой строке.CSV разбор с IFS bash: выберите ";" как разделитель

Вот что я сделал:

while IFS=";" read [my 130 vars] 
[what i do with the vars] 
done < file.csv 

Но у меня есть проблемы на некоторых строк, так как исходный CSV я получаю, как:

"Hi";"i";"got;a problem" 

Как вы можете видеть, у меня есть проблема с ; в значении. И IFS читает его как разделение двух значений. Итак, вот мой вопрос: есть ли способ взять «;» как разделитель, а не просто; ?

+0

вы пытались 'IFS = "\", \ "" '? –

+0

Спасибо за ваш ответ, да, я пробовал, и он не работал:/ – Neringan

+0

Но что сообщение об ошибке? –

ответ

3

Вы можете использовать awk:

gawk 'BEGIN{FPAT="([^;]+)|(\"[^\"]+\")"}{for(i=1;i<=NF;i++){printf ("%s\n",$i)}}' file.csv 

ввод данных, было бы произвести:

"Hi" 
"i" 
"got;a problem" 

(. Я сомневаюсь, что это возможно, чтобы достичь желаемого результата с помощью bash, т.е. путем манипулирования IFS)

+1

Вот и все. Я не мог понять, что такое awk. +1. – slayedbylucifer

+0

@slayedbylucifer Я не уверен, чего хочет OP, но я бы выбрал Perl над чем-либо еще для таких задач. – devnull

+0

Отлично! благодаря – Neringan

2

, если вы хорошо с perl, то:

# cat version 
"Hi";"i";"got;a problem" 

# perl -MText::ParseWords -n -l -e 'print $_ for parse_line(";", 1, $_);' version 
"Hi" 
"i" 
"got;a problem" 

Я уверен, что должен быть способ добиться того же с awk

Я мог бы справиться с sed:

# cat version | sed 's/;\("[^"]*"\)*/\n\1/g' 
"Hi" 
"i" 
"got;a problem" 
+0

Спасибо! Грустно мы не можем принять два ответа :) – Neringan

+0

@Neringan Но вы все равно могли бы продвигаться! – devnull

+0

@devnull на самом деле да теперь у меня 15 репутации я могу :) – Neringan