Aqui você vai com awk e processa o arquivo apenas uma vez.
awk -F'|' 'NR==1{print;next} m && NF{print m}
NF{l="\n"$0; $5=$4; m="\n"$0; c=0}; !NF{c++}
END{ print l; for (; i++<c;)print }' OFS='|' infile
Explicação:
Aqui, estamos destacando a primeira linha para substituir o valor do campo 5 th pelo valor do campo 4 th e apenas imprimi-lo e fazer next .
... se (linha seguinte atual) não for linha vazia (pelo menos contém um campo NF ), então faça um backup da linha inteira com um \n ewline adicionado l="\n"$0 primeiro próximo conjunto 5 < o valor do campo sup> th com o valor do campo 4 th $5=$4 e o último definiu como uma variável m com \n ewline adicionado m="\n"$0; ; Há uma variável c como um sinalizador contador e é usada para determinar o número de linhas vazias !NF{c++} se nenhuma linha com pelo menos um campo vista; Caso contrário, c=0 redefinirá esse contador.
Agora modificamos a linha em m variable e m && NF{print m} a imprimirá, onde na próxima etapa awk é executada e m foi definida e não está nas linhas vazias & NF (isso é usado para evitar duplicação na impressão quando a linha vazia).
No final, estamos imprimindo a última linha intacta da qual fazemos backup sempre antes de executar a substituição END{ print l; ... e o número de linhas vazias que nunca viram uma linha com um campo com looping for (; i++<c;)print }' .
Isso é muito mais curto se você não precisar de linhas vazias redundantes.
awk -F'|' 'NR==1{print;next} m && NF{print m}
NF{l=$0; $5=$4; m=$0} END{ print l}' OFS='|' infile