Para substituir novas linhas incorporadas em registros com espaços usando o GNU awk
.
num_fields=4
awk -v RS='([^|]*\|){'"$num_fields"'}[^|]*\n' '
{
n = split(RT, a,"|");
for (i=1; i<=n; ++i)
{
gsub("\n", " ", a[i]);
printf "%s%s", a[i], i==n?"\n":"|"
}
}' file
Isso dá
1|ABC|11|DEF|111
2|ABC|22|PQR ST UW|222
3|ABC|33|XYZ|333
4|ABC|44|LMN|444
O truque aqui é usar o suporte do GNU awk
para separadores de registros arbitrários para definir um como quatro campos terminados por pipe seguido por um campo terminado por nova linha, sem nenhum campo para conter os tubos incorporados (via RS='([^|]*\|){4}[^|]*\n'
).
O separador de registro real que responde a essa especificação é acessível por meio de RT
. É uma simples questão de dividir RT
por canal em uma matriz a
, removendo novas linhas incorporadas de cada elemento de a
e finalmente reconstruindo o registro ao re-concatenar elementos de a