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