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

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

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

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

  • Конкатенация последовательностей под заголовком
  • Как избежать синдрома наклонившейся зубочистки в awk?
  • Diff, показать измененную строку только из правого файла
  • Как grep для текста в файле и отображать абзац с текстом?
  • Развернуть заполнители с одинаковыми именами в текстовом файле?
  • Bash - Конвертировать символ escape-символа в BBCode
  •  fruit apple word fruit lemon other word fruit orange word meat ham word vegetable salad other vegetable lettuce more 

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

  • awk, когда оба разделителя и кавычки используются для поля
  • Заменить непечатаемые символы в perl и sed
  • Почему мои одиночные кавычки исчезают при подстановке с sed
  • Как я могу перечислить все строки после того, как два последующих шаблона будут сопоставлены, когда они не будут
  • Как настроить интервал между символами после определенной строки?
  • Изменить строку, если оригинал не соответствует определенной строке.
  • 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 
    Linux и Unix - лучшая ОС в мире.