Соединять строки, которые не заканчиваются запятой

#csv #awk #sed #tr #solaris-10

#csv #awk #sed #tr #solaris-10

Вопрос:

У меня есть CSV-файл, созданный MS Excel. Если в исходной электронной таблице существуют объединенные ячейки, исходные строки, содержащие их, становятся многострочными в выходных данных CSV. Я хотел бы объединить их обратно в одну строку.

Я ищу инструмент Unix (Solaris 10) (sed / awk / tr и т.д.), Который соединит все строки, не заканчивающиеся запятой, со следующей строкой, оставив все строки, заканчивающиеся запятой, нетронутыми. Символ новой строки в конце строк, не заканчивающихся запятой, будет заменен пробелом.

Например. Если входной файл содержит:

 ,Dilbert,
,,Wally,
Alice,
Asok9
Dogbert:
Catbert,
Ratbert,
  

Тогда результирующий вывод будет:

 ,Dilbert,
,,Wally,
Alice,
Asok9 Dogbert: Catbert,
Ratbert,
  

Спасибо.

Ответ №1:

Вот так:

 awk '{printf "%s"(/,$/?RS:FS),$0}' file
,Dilbert,
,,Wally,
Alice,
Asok9 Dogbert: Catbert,
Ratbert,
  

Если строка заканчивается на , использовать RS (выбор записи — новая строка по умолчанию)
Если нет, используйте FS (Разделитель полей по умолчанию — один пробел)

Комментарии:

1. Вау, это было быстро. Мне нравится логика этого, но в моей системе это не работает. Я получаю сообщение об ошибке awk: syntax error near line 1 awk: illegal statement near line 1 . К сожалению, у меня нет доступного gawk, поэтому просто использую стандартный awk, который поставляется с Solaris 10. Знаете ли вы способ преобразования этого в синтаксис, который распознает данная версия awk?

2. Просматривая справочную страницу awk, чтобы узнать, была ли там помощь, я заметил под SEE ALSO разделом nawk(1) . Я использовал nawk вместо awk и получил именно то, что хотел. Большое спасибо. Очень элегантно.

Ответ №2:

 sed ':a
/,$/ b
$ b
N;s/n/ /;b a' YourFile
  

тот же трюк с sed, измените /,$/ на /, *$/ , если присутствуют некоторые пробелы в конце

Комментарии:

1. Отлично. Спасибо за это. Это также хорошо работает в моем входном файле.