Даже немного короче, чем версия John1024
awk 'BEGIN { RS=""; ORS="\n\n"}{$1=$1}1'
или
awk -v RS="" -v ORS="\n\n" '{$1=$1}1'
Использование RS=""
говорит awk использовать любой абзац в качестве записи (то есть блок текста, разделенный пустыми строками). Но он также сообщает awk, что всегда является разделителем поля в сочетании с FS
. Просто переопределив разделитель выходной записи ORS
, мы можем вывести все, что вы захотите, сказав awk переопределить свою запись $0
, сбросив первую запись $1=$1
. Это приводит к тому, что все разделители полей, определенные FS
(здесь используется значение по умолчанию) и символы новой строки (из-за RS=""
), заменяются на OFS
(по умолчанию a <пробел;>). Наконец мы печатаем запись с 1
Вы можете избавиться от всех пробелов, если дополнительно установить OFS=""
RS
Первый символ строкового значения RS
должен быть разделителем входных записей; по умолчанию. Если RS
содержит более одного символа, результаты не указываются. Если RS
равно null
, то записи разделяются последовательностями, состоящими из плюс одна или несколько пустых строк, начальные или конечные пустые строки не должны приводить к пустым записям в начале или конце ввода, и всегда должен быть разделителем полей, независимо от значения FS
.
источник: стандарт POSIX awk