Uma solução bash :
declare -a out
EOF=false
IFS=$'='
until $EOF; do
read -r skip val || EOF=true
if [ ! -z "$val" ]
then
out+=("${val//[[:space:]]/}")
else
tmp="${out[@]}"
printf '%s\n' "${tmp// /,}"
out=()
fi
done < file
Como isso funciona
- Declare o array
outpara manter a linha de saída, defina a variávelEOFpara acompanhar o final do arquivo,IFSpara o separador do campo de entrada pararead. - Até lermos o final do arquivo, lemos cada linha do arquivo, definimos o valor do último campo como variável
val. -
if [ ! -z "$val" ]: verifique se o comprimento da variável$valnão é zero, removemos espaço em$val, enviamos para a matrizout. - se o comprimento
$valfor zero, o que significa que obtemos linha em branco ou fim de arquivo, atribuímos todo o elemento da matrizoutà variável tmp e substituímos toda a variável de espaçotmpby,, nossa saída projetada recode separador. - Defina
outcomo nulo para o próximo trabalho.
Outra solução, mais concisa, mais curta para você é usar perl :
$ perl -F'=' -anle '
BEGIN { $, = "," }
push @out,$F[-1] if @F;
print @{[map {s/\s// && $_} @out]} and @out = ()
if /^$/ or eof;
' file
3,404212109727229,A24AD11812232B47688ADBF15CE05CA9,1,SIM,COMP128_3
3,404212109727230,A24AD11812232B47688ADBF15CE05CB8,1,SIM,COMP128_3
3,404212109727231,A24AD11812232B47688ADBF15CE05CD6,1,SIM,COMP128_3