Добавление новой строки в текстовый файл после 5 появлений запятой в Bash - PullRequest
0 голосов
/ 10 мая 2018

У меня есть текстовый файл, который представляет собой один гигантский файл Excel в одной строке в текстовом файле.Пример может быть таким:

Name,Age,Year,Michael,27,2018,Carl,19,2018

Мне нужно изменить третье вхождение запятой в новую строку, чтобы я получил

Name,Age,Year 
Michael,27,2018 
Carl,19,2018

Пожалуйста, дайте мне знать, если этоСлишком неоднозначно и как всегда заранее благодарю за помощь!

Ответы [ 5 ]

0 голосов
/ 12 мая 2018

Это может работать для вас (GNU sed):

sed 's/,/\n/3;P;D' file

Заменить каждую третью , новой строкой, вывести, удалить первую строку и повторить.

0 голосов
/ 10 мая 2018

Вы ищете 3 фрагмента, каждый без запятой и разделенный запятой.Последние поля могут создавать проблемы (не заканчиваются запятой и могут содержать только два поля.
Следующая команда выглядит хорошо.

grep -Eo "([^,]*[,]{0,1}){0,3}" inputfile
0 голосов
/ 10 мая 2018

С помощью Gnu sed:

sed -E 's/(([^,]*,){2}[^,]*),/\1\n/g'

Чтобы изменить количество полей в строке, измените {2} на число, меньшее количества полей.Например, чтобы изменить каждую пятую запятую (как в заголовке вашего вопроса), вы должны использовать:

sed -E 's/(([^,]*,){4}[^,]*),/\1\n/g'

В регулярном выражении [^,]*, означает «ноль или более»символы, отличные от ,, за которыми следует ,, другими словами, это одиночное поле, разделенное запятыми. Это не будет работать, если поля представляют собой строки в кавычках с внутренними запятыми или символами новой строки.

Независимо от того,из того, что говорит man sed в Linux, флаг -E является расширением Posix sed, что заставляет sed использовать расширенные регулярные выражения (ERE) вместо базовых регулярных выражений (см. man 7 regex). -E также работает на BSDsed, используется по умолчанию в Mac OS X. (Спасибо @EdMorton за примечание.)

0 голосов
/ 10 мая 2018

С GNU awk для нескольких символов RS:

$ awk -v RS='[,\n]' '{ORS=(NR%3 ? "," : "\n")} 1' file
Name,Age,Year
Michael,27,2018
Carl,19,2018

С любым awk:

$ awk -v RS=',' '{sub(/\n$/,""); ORS=(NR%3 ? "," : "\n")} 1' file
Name,Age,Year
Michael,27,2018
Carl,19,2018
0 голосов
/ 10 мая 2018

Попробуйте это :

$ cat /tmp/22.txt
Name,Age,Year,Michael,27,2018,Carl,19,2018,Nooka,35,1945,Name1,11,19811

$ echo "Name,Age,Year"; grep -o "[a-zA-Z][a-zA-Z0-9]*,[1-9][0-9]*,[1-9][0-9]\{3\}" /tmp/22.txt
Michael,27,2018
Carl,19,2018
Nooka,35,1945
Name1,11,1981

Или ,[1-9][0-9]\{3\}, если вы не хотите ставить [0-9] еще 3 раза для партии YYYY.

PS : Это решение даст вам только YYYY за год (даже если данные для YYYY равны 19811 (опечатки, если есть), вы все равно получите 1981

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...