#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. Отлично. Спасибо за это. Это также хорошо работает в моем входном файле.