2016-11-27 3 views
0

У меня есть плоский файл, содержащий все записи в одной строке, потому что в файле нет нового символа строки. Пример: Имя, возраст, группа, адрес, имя, возраст, группа, адрес, имя, возраст, группа, адрес В идеале они должны были быть 3 записи, но все они были прочитаны моим инструментом ETL как одна запись , Я нашел что-то на сайте, который был похож на мою проблему и было решение:Необходимо Объяснение вокруг команды Sed

sed 's/\([^,]*,[^,]*\),/\1\n/g'1) 

Я не пробовал еще, но я собираюсь, однако, я не понять ничего после СЭД «s/ , Может кто-то, пожалуйста, понять, что каждый из этих символов после 's/ делает.

, а также если у кого-то есть другое решение для получения этой длинной строки столбцов, которая считывается как отдельные записи, которые должны быть разделены по строкам.

Спасибо,

Rajni

+0

Это может помочь: [Стек Переполнение Регулярные выражения FAQ] (http://stackoverflow.com/a/22944075/ 3776858) – Cyrus

ответ

0

Если предположить, что в этом вопросе задний 1) опечатка,

sed 's/\([^,]*,[^,]*\),/\1\n/g' 

заменит каждую вторую запятую с новой строки (если у вас есть СЭД, который чтит \n в заменяющей строке, а не во всех реализациях). \( и \) начинают и завершают группу соответственно. [^,]* соответствует самой длинной строке символов без запятой, а , соответствует одной запятой. / является разделителем, так что команда s глобально заменяет все вхождения шаблона на группу (две строки, разделенные запятой) и новую строку.

Это явно не то, что вы хотите. Для замены 4-го запятая каждой строки с символом новой строки, вы можете сделать (с гну СЭД):

sed -n ':a; s/,/\n/4; t b; :b; {P; D}; b a;' 

Есть более эффективные способы (например, Perl), чтобы сделать это, но так как цель этого вопроса, кажется, быть более понятным sed, чем фактически фильтровать данные, это интересное решение для изучения.

+0

Спасибо за вашу помощь в объяснении, я думал, что^означает начало строки в Седе, что я помню, где-то читал, но из того, что вы объяснили, это указывает на отрицание в этом контексте правильно? это помогло мне. И что такое \ 1 до того, как \ n работает? У меня есть другой вопрос, который мы даем в конце, например \ g или \ 1 или \ 3, что это значит? ex: \ 3 - означает ли это, что он должен заменять каждое третье событие или все вхождения, начиная с третьего? – Rajni

1

Предполагая, что ваш файл называется input.txt, вы могли бы попробовать что-то вроде этого:

xargs -a input.txt -n4 -d"," printf "%s,%s,%s,%s\n" 
+0

Большое вам спасибо. – Rajni

Смежные вопросы