1

У меня было очень красочное утро, когда я изучал внутреннюю часть команды sort Linux, и натолкнулся на еще одну проблему, на которую я не могу найти ответ в документации.

В настоящее время я использую -t, чтобы указать, что мои поля разделены запятой, но я обнаружил, что в некоторых моих файлах запятая используется (между двойными кавычками) в значениях:

Jonathan Sampson,,foo@bar.com,0987654321
"Foobar CEO,","CEO,",ceo@foobar.com,,

Как я могу использовать запятую для завершения моих полей, но игнорировать вхождения в значения? Это довольно просто, или мне нужно реэкспортировать все мои данные, используя более чужой терминатор поля? (К сожалению, у меня нет никакого контроля над объявлением другого терминатора в этом конкретном проекте).

2 ответа2

0

В формате CSV поле может содержать запятые при условии, что поле заключено в кавычки:

field1, "field2,with,commas"  ,  field3  ,  "field4,foo"

У нас есть смесь полей в кавычках и без кавычек, которые не могут быть проанализированы напрямую по любому значению FS (по крайней мере, насколько я знаю). Тем не менее, мы все равно можем получить поля, используя match () в цикле (и немного обманывая):

$0=$0",";                                  # yes, cheating

while($0) {

  match($0,/[^,]*,| *"[^"]*" *,/);            

  sf=f=substr($0,RSTART,RLENGTH);          # save what matched in sf

  gsub(/^ *"?|"? *,$/,"",f);               # remove extra stuff

  print "Field " ++c " is " f;

  sub(sf,"");                              # "consume" what matched

}

По мере увеличения сложности формата (например, когда в полях разрешены экранированные кавычки), решения awk становятся более хрупкими. Хотя я не должен говорить об этом здесь, для чего-то более сложного, чем в предыдущем примере, я предлагаю использовать другие инструменты (например, Perl, просто чтобы назвать один). Кстати, похоже, что здесь есть библиотека разбора awk CSV: http://lorance.freeshell.org/csv/ (я не пробовал).

0

Я думаю, что sort абсолютно ограничена разделителями полей. Хорошим кандидатом может быть вкладка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .