POSIXly, você poderia fazer algo como:
<file awk '
BEGIN{srand(); n=rand()}
{print n, NR, $0}
!NF {n=rand()}
END {if (NF) print n, NR+1, ""}' |
sort -nk1 -k2 |
cut -d' ' -f3-
Ou seja, prefixe cada linha com <a-random-number-that-changes-with-each-paragraph>
, em seguida, o número da linha, em seguida, classifique numericamente no primeiro número e depois em segundo para manter a ordem da linha nos parágrafos e remover esses números extras.
Pode-se querer canalizar para sed '$d'
para remover a linha em branco final.
Tenha em atenção que com a maioria awk
implementations srand()
utiliza o tempo unix epoch para propagar o gerador de números pseudo-aleatórios, para que possa obter o mesmo resultado se for executado duas vezes no mesmo segundo (a erro histórico agora gravado na especificação POSIX, apesar dos meus esforços, infelizmente ).