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
out
para manter a linha de saída, defina a variávelEOF
para acompanhar o final do arquivo,IFS
para 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$val
não é zero, removemos espaço em$val
, enviamos para a matrizout
. - se o comprimento
$val
for 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çotmp
by,
, nossa saída projetada recode separador. - Defina
out
como 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