Отдельные «дублированные строки» по пустой строке

Мой вклад выглядит примерно так:

fruit apple word fruit lemon fruit orange other word meat ham word vegetable salad other vegetable lettuce more 

Как я могу отделить повторяющиеся строки пустой строкой, основанной на первом слове? Как это:

 fruit apple word fruit lemon other word fruit orange word meat ham word vegetable salad other vegetable lettuce more 

Edit: Я забыл упомянуть, что после первого слова возможно иметь пробелы.

  • замените символ из строки, которая находится между первым и вторым поиском, используя sed или awk
  • Как я могу использовать sed, чтобы отрезать строку от строки?
  • Заменить строку, содержащую символы новой строки
  • Как добавить атрибут в тег в файле XML по командной строке?
  • Создание отдельной таблицы из нескольких файлов
  • Как добавить другой префикс для каждой строки в grep-выходе?
  • Индексирование массива с использованием команды "sed"
  • Команда UNIX для замены в разделителе в зависимости от положения разделителя
  • 3 Solutions collect form web for “Отдельные «дублированные строки» по пустой строке”

    Вот базовая команда, которую вы можете адаптировать к вашим индивидуальным потребностям.

     awk '{print $0 > $1}' inputfile 

    EDIT: Извиняюсь, я просто понял, что неправильно излагаю ваш вопрос, это не правильный ответ, хотя вы можете «легко присоединить» файлы с пустыми строками

    Вот возможное решение

     for file in $(awk '{print $1; print $0 > $1}' data.txt | sort | uniq) do cat $file echo rm $file done > output.txt 

    Решение просто использует awk, если файл предварительно отсортирован:

     awk '{a=$1; if (b != "" && a != b) {printf "\n";}; print $0; b = a}' inputfile 

    Переработано после комментариев don_crissti (спасибо!)

     awk '{if (a != "" && a != $1) {printf "\n";}; print $0; a = $1}' inputfile 

    Решение sed может быть

     sed ' /^\n/!{ #if line do not starts from \newline N #attach next line /^\(\w\+\b\).*\n\1/! s/\n/\n\n/ #if 1st word not a same insert \newline } P #print 1st line (before \newline) D #remove 1st line, return to start ' 

    другое awk решение, предполагает сортированный ввод, как показано в примере ввода

     $ cat ip.txt fruit apple word fruit lemon fruit orange other word meat ham word vegetable salad other vegetable lettuce more 

    Примечание: порядок проверки состояния.

     $ awk '!seen[$1]++ && NR>1{printf "\n"} 1' ip.txt fruit apple word fruit lemon fruit orange other word meat ham word vegetable salad other vegetable lettuce more 

    Аналогичное решение в perl

     $ perl -ane 'print "\n" if !$seen{$F[0]}++ && $. > 1; print' ip.txt fruit apple word fruit lemon fruit orange other word meat ham word vegetable salad other vegetable lettuce more 
    Interesting Posts

    Текст цензора с регулярным выражением

    Как я могу узнать, какую беспроводную карту у меня есть на выходе lspci

    Расширить раздел sda3 в openSUSE?

    Запустить банку при запуске во всех системах на основе * nix

    Не удается обновить glibc на CentOS 7

    Подписание нового ключа со старым истекшим

    Добавить каталог в путь для всех оболочек и пользователей в SLES 11.1

    Как выделить больше места для обмена и увеличения его размера больше, чем Рам?

    Как отказаться от приема широковещательных сообщений?

    Проблемы с маршрутизацией для нескольких восходящих линий / провайдеров

    Как определить, была ли сжата файловая система?

    Шифровать файлы с помощью gpg (и их симметричного шифрования ключа) – это нормально делать в мире * nix?

    Конфигурация двух экранов Fluxbox

    Как получить доступ для чтения и записи (безопасный) к файловой системе ext4, используемой второй ОС, запущенной из виртуального

    Предотвращение случайного удаления каталогов. Создание псевдонима, содержащего параметры?

    Linux и Unix - лучшая ОС в мире.