Есть ли способ добавить новые строки в таблицу для создания подгрупп?

Мне сложно понять, как это сделать, поэтому Google-fu терпит неудачу.

У меня есть текстовый файл с таблицей данных. Я хотел бы вставить новые строки для визуального разделения подгрупп.

Например, если я начну с:

jan ford jan trillian mar trillian sep marvin 

И первым полем является мое поле подгруппы, тогда выход должен быть:

 jan ford jan trillian mar trillian sep marvin 

Я могу сделать что-то вроде ^(az){3}\t(.*)\n\1\t(.*)$ Чтобы идентифицировать две строки, где месяц тот же, но я не знаю, как их совместить, когда они все иначе.

В идеале я бы хотел, чтобы это было регулярным выражением, которое я могу бросить в BBedit, но я открыт для других решений.

3 Solutions collect form web for “Есть ли способ добавить новые строки в таблицу для создания подгрупп?”

Похоже, bbedit – это какой-то платный редактор OSX. Боюсь, я никогда не использовал его и не могу его установить, поэтому я не могу вам помочь. Основываясь на регулярном выражении, которое вы показываете, он имеет свой собственный синтаксис регулярных выражений, поэтому маловероятно, что вы найдете решение на общем * nix-сайте, используя его. Однако, вот пара других вариантов. В обоих случаях идея состоит в том, чтобы сохранить первое поле и напечатать пустую строку, если она отличается от той, что была показана на предыдущей строке:

 $ awk '{if($1!=last && NR>1){print ""}last=$1;}1;' file jan ford jan trillian mar trillian sep marvin 

awk – это язык сценариев, который предназначен для обработки данных на местах. Он автоматически разбивает каждую строку на поля, которые затем могут называться $1 , $2$N Таким образом, сценарий выше сохранит первое поле в переменной last , а для каждой строки, кроме первой (это то, что означает NR>1 ), он напечатает пустую строку, если last не совпадает с текущим сохраненным значением. 1; это сокращение от awk для печати каждой строки.

В качестве альтернативы вы также можете сделать это в perl :

 $ perl -lape '$F[0] ne $last && $.>1 && print ""; $last=$F[0]' file jan ford jan trillian mar trillian sep marvin 

Здесь мы используем ключи командной строки perl чтобы выполнить большую часть работы. -a делает perl действовать как awk и разбивает каждую входную строку на массив @F . Поэтому $F[0] является первым полем. -l делает perl добавляет новую строку для каждого вызова print , поэтому print "" просто печатает пустую строку. -p делает печать каждой строки ввода после применения сценария, заданного -e . Сам скрипт точно такой же, как и awk выше.

 awk 'NR > 1 && $1 != last {print ""}; {print; last = $1}' 

Поскольку вы можете совместить дубликаты, тогда вы захотите отменить свое действие. Вы могли бы сделать так:

 sed -e'/^\n/!{$n;G;N;s/^\(\(...\).*\)\n\2/\1\2/;}' -eP\;D <in >out 

Другими словами, начните с файла с двойным интервалом и выделите второе пространство между вашими группами.

Запустив это на ваш пример, выполните следующие действия:

 jan ford jan trillian mar trillian sep marvin 

Что на самом деле приводит меня к вопросу для вас: я думаю, что я понимаю, как Триллиан может иметь два дня рождения с параллельными вселенными и всеми, но не могли бы вы объяснить, почему вы думаете, что у Марвина может быть один? Думаю, сентябрь подойдет, хотя это всегда мрачно.


Вот еще один, любезность @don_crissti (если слегка изменена) :

 sed -etD -e'$q;N;/^\(...\).*\n\1/!s/\n/&&/;:D' -eP\;D 

Мне нравится его намного лучше. Сначала он спросил меня: зачем редактировать новые строки, а не просто редактировать их? На самом деле у меня не было никакого ответа, и это было в основном амбивалентно, потому что я не считал, что это имеет большое значение.

Дело в том, что используемый здесь метод lookahead требует буфера для ножевого края – он может сообщать о ложных срабатываниях, если буфер растет больше, чем самые последние две строки ввода за раз. Балансирование одной строки lookahead становится сложнее, когда вы также вставляете новые строки в тот же самый поток, который вы соответствуете, и требует, чтобы вы могли легко отличить строку ввода, которую вы вставили, или строку, которая вам нужна для читать. Этот баланс требует по крайней мере одного дополнительного теста за цикл – и я получаю с помощью /^\n/! тест выше.

Но очень важной частью седельного механизма является возвращение s/// ubstitution, которое делает условное ветвление в случае успеха. Поскольку его замены всегда генерируют дополнительную строку, цикл линии sed – это то, что очищает возвращение t est – не перевернулось, когда пространство с образцом D eleted и все еще работает в верхней части скрипта. Таким образом, дон не может быть очень простым для каждой вставки и надежно оценивать результат предыдущей итерации в начале следующего.

Так что поднимитесь на один из его ответов, потому что я думаю, он не собирается его здесь указывать.


Команда G et добавляет пространство удержания sed пространство шаблонов после вставленного разделителя e_line. Пространственное пространство здесь никогда не используется, и поэтому все, что есть G ot, является \n ewline.

Команда N ext добавляет строку ввода N ext к пространству шаблонов после вставленного разделителя e-line. Выполнение G et, а затем N ext для каждой строки ввода получает два \n строк для каждой строки ввода.

  • Как я могу рассчитать среднее значение для каждой строки, исключая первое значение каждой строки?
  • Могу ли я создать специальный файл в linux, который на самом деле является результатом сценария?
  • Как удалить двойные кавычки и точки из файла
  • Одна колонка на две
  • Удалите повторяющиеся поля в данном столбце (после проверки идентификатора)
  • Печатать содержимое файла с желаемого символа и заканчивать также желаемым символом
  • Есть ли альтернатива команде «sed -i» в Solaris?
  • как заменить разделитель между двумя другими разделителями в unix
  • Найдите строку, затем удалите два тега и повторите
  • Удалите N-ю строку из каждой строки, соответствующей шаблону
  • получить столбец из файла на основе другого столбца
  • Linux и Unix - лучшая ОС в мире.