Changing last entries in a comma delimited list












8















I have a huge text file which look like this:



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


The desired output is this:



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


I have tried other relevant posts here and on other communities but could not exactly get what I want.



UPDATE



This is the cross-question (I wanted both Unix/perl answers and batch/powershell solutions for this.) that has interesting answers.










share|improve this question





























    8















    I have a huge text file which look like this:



    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


    The desired output is this:



    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


    I have tried other relevant posts here and on other communities but could not exactly get what I want.



    UPDATE



    This is the cross-question (I wanted both Unix/perl answers and batch/powershell solutions for this.) that has interesting answers.










    share|improve this question



























      8












      8








      8


      1






      I have a huge text file which look like this:



      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


      The desired output is this:



      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


      I have tried other relevant posts here and on other communities but could not exactly get what I want.



      UPDATE



      This is the cross-question (I wanted both Unix/perl answers and batch/powershell solutions for this.) that has interesting answers.










      share|improve this question
















      I have a huge text file which look like this:



      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


      The desired output is this:



      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


      I have tried other relevant posts here and on other communities but could not exactly get what I want.



      UPDATE



      This is the cross-question (I wanted both Unix/perl answers and batch/powershell solutions for this.) that has interesting answers.







      shell-script text-processing






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 34 mins ago







      M-M

















      asked Apr 13 '17 at 18:56









      M-MM-M

      1587




      1587






















          5 Answers
          5






          active

          oldest

          votes


















          14














          awk approach with sprintf function(to add leading zeros):



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


          The output:



          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, - set comma , as field separator



          $8 - points to the eighth field



          %02d - format which treats function argument as 2-digit number





          Note, the last field in a record can be presented by $NF.




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




          So, $NF is the same as $8(for your input)



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





          share|improve this answer





















          • 1





            You should use NF to refer to the last field rather than hardcoding after counting.

            – heemayl
            Apr 14 '17 at 5:02











          • @heemayl, added additional note

            – RomanPerekhrest
            Apr 14 '17 at 6:44






          • 1





            A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

            – Olivier Dulac
            Apr 14 '17 at 12:38





















          3














          You can try using awk:



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





          share|improve this answer

































            2














            Here's perl solution:



            $ 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


            The -a flag allows us to treat input as array, based on separator specified with -F. Basically we alter last item in that array, and rebuild it via join command.






            share|improve this answer


























            • Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

              – M-M
              Apr 13 '17 at 20:47






            • 1





              @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

              – Sergiy Kolodyazhnyy
              Apr 13 '17 at 20:56











            • Agreed! Your point stands corrected.

              – M-M
              Apr 13 '17 at 21:04



















            1














            With input data like:



            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


            in text.csv



            the code below



            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


            produces output like:



            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





            share|improve this answer


























            • Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

              – M-M
              Apr 13 '17 at 19:39



















            0














            Tcl



            Here is my solution, done using Tcl which reads from input.csv file and puts the result in output.csv file



            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


            demonstration






            share|improve this answer























              Your Answer








              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "106"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f358853%2fchanging-last-entries-in-a-comma-delimited-list%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              5 Answers
              5






              active

              oldest

              votes








              5 Answers
              5






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              14














              awk approach with sprintf function(to add leading zeros):



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


              The output:



              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, - set comma , as field separator



              $8 - points to the eighth field



              %02d - format which treats function argument as 2-digit number





              Note, the last field in a record can be presented by $NF.




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




              So, $NF is the same as $8(for your input)



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





              share|improve this answer





















              • 1





                You should use NF to refer to the last field rather than hardcoding after counting.

                – heemayl
                Apr 14 '17 at 5:02











              • @heemayl, added additional note

                – RomanPerekhrest
                Apr 14 '17 at 6:44






              • 1





                A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

                – Olivier Dulac
                Apr 14 '17 at 12:38


















              14














              awk approach with sprintf function(to add leading zeros):



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


              The output:



              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, - set comma , as field separator



              $8 - points to the eighth field



              %02d - format which treats function argument as 2-digit number





              Note, the last field in a record can be presented by $NF.




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




              So, $NF is the same as $8(for your input)



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





              share|improve this answer





















              • 1





                You should use NF to refer to the last field rather than hardcoding after counting.

                – heemayl
                Apr 14 '17 at 5:02











              • @heemayl, added additional note

                – RomanPerekhrest
                Apr 14 '17 at 6:44






              • 1





                A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

                – Olivier Dulac
                Apr 14 '17 at 12:38
















              14












              14








              14







              awk approach with sprintf function(to add leading zeros):



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


              The output:



              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, - set comma , as field separator



              $8 - points to the eighth field



              %02d - format which treats function argument as 2-digit number





              Note, the last field in a record can be presented by $NF.




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




              So, $NF is the same as $8(for your input)



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





              share|improve this answer















              awk approach with sprintf function(to add leading zeros):



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


              The output:



              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, - set comma , as field separator



              $8 - points to the eighth field



              %02d - format which treats function argument as 2-digit number





              Note, the last field in a record can be presented by $NF.




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




              So, $NF is the same as $8(for your input)



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






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Apr 14 '17 at 6:47

























              answered Apr 13 '17 at 19:18









              RomanPerekhrestRomanPerekhrest

              23.1k12448




              23.1k12448








              • 1





                You should use NF to refer to the last field rather than hardcoding after counting.

                – heemayl
                Apr 14 '17 at 5:02











              • @heemayl, added additional note

                – RomanPerekhrest
                Apr 14 '17 at 6:44






              • 1





                A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

                – Olivier Dulac
                Apr 14 '17 at 12:38
















              • 1





                You should use NF to refer to the last field rather than hardcoding after counting.

                – heemayl
                Apr 14 '17 at 5:02











              • @heemayl, added additional note

                – RomanPerekhrest
                Apr 14 '17 at 6:44






              • 1





                A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

                – Olivier Dulac
                Apr 14 '17 at 12:38










              1




              1





              You should use NF to refer to the last field rather than hardcoding after counting.

              – heemayl
              Apr 14 '17 at 5:02





              You should use NF to refer to the last field rather than hardcoding after counting.

              – heemayl
              Apr 14 '17 at 5:02













              @heemayl, added additional note

              – RomanPerekhrest
              Apr 14 '17 at 6:44





              @heemayl, added additional note

              – RomanPerekhrest
              Apr 14 '17 at 6:44




              1




              1





              A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

              – Olivier Dulac
              Apr 14 '17 at 12:38







              A word of warning (irrelevant in this exemple, but could apply in other cases) : changing a value of one of the fields (here: $8) "recomputes" the whole line's fields, and have side effets: ex1: loses 'multiple separators': echo "1   2 3    4" | awk '{$2=$2;print $0}' gives: 1 2 3 4 (only 1 space (or OFS) left between fields). ex2) echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}' gives: 1   2 3    4 (commas became spaces) . There could be other side effects. Test and take another approach (gsub on a copy variable of $0,for ex) if assiging a field have detrimental side effects.

              – Olivier Dulac
              Apr 14 '17 at 12:38















              3














              You can try using awk:



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





              share|improve this answer






























                3














                You can try using awk:



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





                share|improve this answer




























                  3












                  3








                  3







                  You can try using awk:



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





                  share|improve this answer















                  You can try using awk:



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






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Apr 13 '17 at 19:28

























                  answered Apr 13 '17 at 19:21









                  taliezintaliezin

                  6,85011628




                  6,85011628























                      2














                      Here's perl solution:



                      $ 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


                      The -a flag allows us to treat input as array, based on separator specified with -F. Basically we alter last item in that array, and rebuild it via join command.






                      share|improve this answer


























                      • Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

                        – M-M
                        Apr 13 '17 at 20:47






                      • 1





                        @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

                        – Sergiy Kolodyazhnyy
                        Apr 13 '17 at 20:56











                      • Agreed! Your point stands corrected.

                        – M-M
                        Apr 13 '17 at 21:04
















                      2














                      Here's perl solution:



                      $ 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


                      The -a flag allows us to treat input as array, based on separator specified with -F. Basically we alter last item in that array, and rebuild it via join command.






                      share|improve this answer


























                      • Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

                        – M-M
                        Apr 13 '17 at 20:47






                      • 1





                        @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

                        – Sergiy Kolodyazhnyy
                        Apr 13 '17 at 20:56











                      • Agreed! Your point stands corrected.

                        – M-M
                        Apr 13 '17 at 21:04














                      2












                      2








                      2







                      Here's perl solution:



                      $ 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


                      The -a flag allows us to treat input as array, based on separator specified with -F. Basically we alter last item in that array, and rebuild it via join command.






                      share|improve this answer















                      Here's perl solution:



                      $ 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


                      The -a flag allows us to treat input as array, based on separator specified with -F. Basically we alter last item in that array, and rebuild it via join command.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Apr 13 '17 at 20:44

























                      answered Apr 13 '17 at 20:13









                      Sergiy KolodyazhnyySergiy Kolodyazhnyy

                      10.5k42663




                      10.5k42663













                      • Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

                        – M-M
                        Apr 13 '17 at 20:47






                      • 1





                        @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

                        – Sergiy Kolodyazhnyy
                        Apr 13 '17 at 20:56











                      • Agreed! Your point stands corrected.

                        – M-M
                        Apr 13 '17 at 21:04



















                      • Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

                        – M-M
                        Apr 13 '17 at 20:47






                      • 1





                        @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

                        – Sergiy Kolodyazhnyy
                        Apr 13 '17 at 20:56











                      • Agreed! Your point stands corrected.

                        – M-M
                        Apr 13 '17 at 21:04

















                      Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

                      – M-M
                      Apr 13 '17 at 20:47





                      Thank you for your answer. It does help if someone needs perl but still sprintf is the core idea of your answer. Not like if it's not right, just not offering something different than accepted answer. +1 anyways.

                      – M-M
                      Apr 13 '17 at 20:47




                      1




                      1





                      @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

                      – Sergiy Kolodyazhnyy
                      Apr 13 '17 at 20:56





                      @Masoud well, main reason here is because sprintf() is used typically when writing a string of specific format to a variable, which is why it is used in many other languages. I can write it in Python as well - Python doesn't have sprintf() but the core idea will be the same regardless - writing formatted string to a variable. Alternatively, we can operate on array items directly and just print those. With this type of questions there is finite amount of solutions, basically is what I'm trying to say

                      – Sergiy Kolodyazhnyy
                      Apr 13 '17 at 20:56













                      Agreed! Your point stands corrected.

                      – M-M
                      Apr 13 '17 at 21:04





                      Agreed! Your point stands corrected.

                      – M-M
                      Apr 13 '17 at 21:04











                      1














                      With input data like:



                      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


                      in text.csv



                      the code below



                      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


                      produces output like:



                      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





                      share|improve this answer


























                      • Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

                        – M-M
                        Apr 13 '17 at 19:39
















                      1














                      With input data like:



                      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


                      in text.csv



                      the code below



                      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


                      produces output like:



                      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





                      share|improve this answer


























                      • Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

                        – M-M
                        Apr 13 '17 at 19:39














                      1












                      1








                      1







                      With input data like:



                      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


                      in text.csv



                      the code below



                      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


                      produces output like:



                      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





                      share|improve this answer















                      With input data like:



                      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


                      in text.csv



                      the code below



                      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


                      produces output like:



                      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






                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Apr 13 '17 at 19:28

























                      answered Apr 13 '17 at 19:21









                      NormNorm

                      92




                      92













                      • Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

                        – M-M
                        Apr 13 '17 at 19:39



















                      • Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

                        – M-M
                        Apr 13 '17 at 19:39

















                      Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

                      – M-M
                      Apr 13 '17 at 19:39





                      Thank you for your answer. It works fine but I just decided to go with Roman's response since it's just easier to comprehend.

                      – M-M
                      Apr 13 '17 at 19:39











                      0














                      Tcl



                      Here is my solution, done using Tcl which reads from input.csv file and puts the result in output.csv file



                      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


                      demonstration






                      share|improve this answer




























                        0














                        Tcl



                        Here is my solution, done using Tcl which reads from input.csv file and puts the result in output.csv file



                        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


                        demonstration






                        share|improve this answer


























                          0












                          0








                          0







                          Tcl



                          Here is my solution, done using Tcl which reads from input.csv file and puts the result in output.csv file



                          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


                          demonstration






                          share|improve this answer













                          Tcl



                          Here is my solution, done using Tcl which reads from input.csv file and puts the result in output.csv file



                          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


                          demonstration







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Apr 14 '17 at 0:47









                          sergiolsergiol

                          1013




                          1013






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Unix & Linux Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f358853%2fchanging-last-entries-in-a-comma-delimited-list%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              宮崎県

                              濃尾地震

                              シテ島