perl -lane 'print join ",", @F[0..$#F-1], $. == 1 ? qw/appnbr request tasknbr appctx username/ : split /:/, $F[-1] unless $. == 2' input-file.txt
Saída:
id,name,tid,mod,state,appnbr,request,tasknbr,appctx,username
39523,srv0051_0001_0,39642,20-10:59:28,Working,820000,500196,500077
43137,srv0051_0005_0,43156,20-10:59:28,Working,820000,4250501,840057
43895,srv0051_0006_0,43903,20-10:59:28,Working,820000,4250501,840057
47523,srv0051_0009_0,47547,20-10:59:28,Working,600005,4250501,4250846
48841,srv0051_0010_0,48851,20-10:59:28,Working,600005,4290000,4290000
58182,srv0051_0020_0,58188,20-10:59:28,Working,820000,4250501,840057
8297,srv0079_0008_0,8316,20-10:59:27,Working,600005,3070001,3050012
Explicação:
- Divida cada linha, a.k.a., registro, em espaço (s) de branco e armazene os campos reultantes na matriz
@F
. A matriz é indexada de 0
e vai até $#F
. Então, $#F-1
é o segundo último elemento.
- Todas as linhas, exceto a segunda, devem ser processadas, pois o último elemento é o fator decisivo.
- Para a primeira linha, o último elemento é substituído por vários nomes de campos.
- Para os demais, (lembre-se de que o segundo já foi descartado) são divididos em
:
e esses campos divididos vêm no lugar do último elemento.
- A união de todos os elementos é feita pelo
,
e depois impressa em stdout
.
Com POSIX sed
, podemos fazer o seguinte:
sed -e '
2d
s/^[[:blank:]]*//;s/[[:blank:]]*$//;s/[[:blank:]]\{1,\}/ /g ;# trim n squeeze blanks
1s/data$/appnbr request tasknbr appctx username/ ;# line 1 spl processing
y/:/\n/ ;# change all colons to newlines
s/\n/:/;s//:/ ;# undo the transformation for the first 2
y/\n/ / ;# change the rest to blanks
y/ /,/ ;# now change these and the already existing blanks to commas
' input-file.txt