Tcl

Tcl

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 -asinalizador 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 joincomando.

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

demonstração

informação relacionada