Substituição dos últimos caracteres após a última vírgula com uma string

8

Eu tenho um enorme arquivo de texto que se parece com isso:

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

Eu tentei outros posts relevantes aqui e em outras comunidades, mas não consegui exatamente o que eu queria.

UPDATE

Esta é a pergunta cruzada ( Eu queria respostas Unix / perl e soluções batch / powershell para isso.) Que tem respostas interessantes.

    
por Masoud 13.04.2017 / 20:56

5 respostas

14
A abordagem

awk com a função sprintf (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, - defina vírgula , como separador de campos

$8 - aponta para o oitavo campo

%02d - formato que trata o argumento de função como 2 -digit number

Observação , o último campo em um registro pode ser apresentado por $NF .

NF is a predefined variable whose value is the number of fields in the current record

Então, $NF é o mesmo que $8 (para sua entrada)

awk -F, -v OFS=',' '$(NF)=sprintf("MI-%02d", $(NF))' file
    
por 13.04.2017 / 21:18
3

Você pode tentar usar awk :

awk 'BEGIN { FS = OFS = "," } { $NF = sprintf("MI-%02d", $NF); } 1' file
    
por 13.04.2017 / 21:21
2

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

A sinalização -a nos permite tratar a entrada como matriz, com base no separador especificado com -F . Basicamente, alteramos o último item dessa matriz e o reconstruímos por meio do comando join .

    
por 13.04.2017 / 22:13
1

Com dados de entrada como:

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  

em text.csv

o código abaixo

awk -F"," '{ i = 0;
  MyOutLine = "";
  j = NF - 1;
  while ( i < j ) {
    i++;
    MyOutLine = MyOutLine""$i",";
  }
  i++;
  x = sprintf( "%.2i", $i );
  y = "MI-"x;
  MyOutLine = MyOutLine""y;
  print MyOutLine; }' ./text.csv  

produz saída como:

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
    
por 13.04.2017 / 21:21
0

Tcl

Aqui está minha solução, feita usando o 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

    
por 14.04.2017 / 02:47