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

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

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: Я забыл упомянуть, что после первого слова возможно иметь пробелы.

  • Удалять файлы старше 5 дней в UNIX (дата в имени файла, а не в метке времени)
  • И операция по 2 столбцам (даты доступа и mofidy) в файле в linux
  • Поиск второй строки файлов и имена файлов для печати в stdout
  • Добавить строку в список, используя AWK или SED?
  • Смешанное прописное и строчное слово в слове
  • Отфильтруйте файл .CSV на основе 5-го значения столбца файла и распечатайте эти записи в новый файл
  • Извлечь часть строки, используя grep
  • grep -A с обратной совпадением распечатывает только несоответствие в поле после
  • 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

    Как переместить некоторые, но не все файлы из одного каталога в другой?

    Как установить мит-схему в Arch Linux?

    Прокси-сервер SSH по требованию через системные пользовательские устройства с активацией сокета не перезапускается по желанию

    Что делает параметр «i8042.nomux = 1» во время загрузки Ubuntu?

    Что это за файл: .readahead в моем корневом каталоге?

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

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

    Запуск браузера файлов nautilus запускает рабочий стол gnome, как его подавить

    сравнить два столбца разных файлов и распечатать, если они совпадают

    Получить количество файлов в каждом каталоге

    скрипт для замены команды mkdir -p

    Есть ли способ отправить смс на мобильный номер с помощью сценария оболочки?

    cut: опция требует аргумента – 'f'

    ext4 сообщил, что чист с помощью fsck после жесткого сброса: это нормально?

    Получите Sudoers через LDAP. (SUSE Linux Enterprise Server 12)

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