Eu tenho um arquivo de texto enorme parecido com este:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,12
A saída desejada é esta:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
Tentei outras postagens relevantes aqui e em outras comunidades, mas não consegui exatamente o que queria.
ATUALIZAR
Isto é opergunta cruzada(Eu queria respostas Unix/Perl e soluções em lote/Powershell para isso.) que tem respostas interessantes.
Responder1
estranhoabordagem comsprintffunção (para adicionar zeros à esquerda):
awk -F, -v OFS=',' '$8=sprintf("MI-%02d",$8);' file
A saída:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
-F,
- definir vírgula ,
como separador de campo
$8
- aponta para o oitavo campo
%02d
- formato que trata o argumento da função como2-digite o número
Observação, o último campo de um registro pode ser apresentado por $NF
.
NFé uma variável predefinida cujo valor é o número de campos no registro atual
Então, $NF
é o mesmo que $8
(para sua opinião)
awk -F, -v OFS=',' '$(NF)=sprintf("MI-%02d", $(NF))' file
Responder2
Você pode tentar usar awk
:
awk 'BEGIN { FS = OFS = "," } { $NF = sprintf("MI-%02d", $NF); } 1' file
Responder3
Aqui está a solução perl:
$ perl -F',' -lane '$last=$#F;$F[$last]=sprintf("MI-%02d",$F[$last]);print join ",", @F' input.txt
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
O -a
sinalizador nos permite tratar a entrada como um array, com base no separador especificado com -F
. Basicamente, alteramos o último item desse array e o reconstruímos via join
comando.
Responder4
Tcl
Aqui está minha solução, feita usando Tcl que lê o arquivo input.csv e coloca o resultado no arquivo output.csv
set in [open input.csv]
set out [open output.csv w]
while {![eof $in]} {
set line [gets $in]
set last_comma_pos [string last , $line]
puts $out [string range $line 0 $last_comma_pos][format MI-%02d [string range $line $last_comma_pos+1 end]]
}
close $in
close $out