tcl

tcl

Tengo un archivo de texto enorme que se parece a 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

El resultado deseado es este:

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

Probé otras publicaciones relevantes aquí y en otras comunidades, pero no pude obtener exactamente lo que quiero.

ACTUALIZAR

Este es elpregunta cruzada(Quería respuestas de Unix/perl y soluciones por lotes/powershell para esto). Eso tiene respuestas interesantes.

Respuesta1

awkacercarse consprintffunción (para agregar ceros a la izquierda):

awk -F, -v OFS=',' '$8=sprintf("MI-%02d",$8);' file

La salida:

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,- establecer coma ,como separador de campo

$8- señala el octavo campo

%02d- formato que trata el argumento de la función como2-dígito


Nota, el último campo de un registro puede presentarse mediante $NF.

NFes una variable predefinida cuyo valor es el número de campos en el registro actual

Entonces, $NFes lo mismo que $8(para tu opinión)

awk -F, -v OFS=',' '$(NF)=sprintf("MI-%02d", $(NF))' file

Respuesta2

Puedes intentar usar awk:

awk 'BEGIN { FS = OFS = "," } { $NF = sprintf("MI-%02d", $NF); } 1' file

Respuesta3

Aquí está la solución 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

La -abandera nos permite tratar la entrada como una matriz, según el separador especificado con -F. Básicamente, modificamos el último elemento de esa matriz y lo reconstruimos mediante joinun comando.

Respuesta4

tcl

Aquí está mi solución, realizada usando Tcl que lee el archivo input.csv y coloca el resultado en el archivo 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

demostración

información relacionada