Замена последних символов после последней запятой на строку

У меня есть огромный текстовый файл, который выглядит так:

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 

Желаемый результат:

 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 

Я пробовал другие соответствующие должности здесь и в других сообществах, но не мог точно получить то, что хочу.

ОБНОВИТЬ

Это кросс-вопрос (для этого я хотел получить как ответы Unix / perl, так и пакетные / powershell-решения), в котором есть интересные ответы.

  • Как выполнить сценарий оболочки при запуске Kali Linux?
  • Преобразование Bash to Fish: отображение пользовательского сообщения при записи CD в определенный каталог
  • Как назначить вывод команды переменной без запуска команды в подоболочке?
  • bash - Функция escape-символа?
  • Как отправить вывод cmd в tmp-файл, одновременно просматривая файл tmp в vim
  • Команда, которая принимает один числовой аргумент и выводит день недели по формуле
  • алфавитный порядок расширения для *
  • Проверка и изменение разрешения файла скриптом
  • 5 Solutions collect form web for “Замена последних символов после последней запятой на строку”

    awk с функцией sprintf (для добавления начальных нулей):

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

    Выход:

     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, – установить запятую , как разделитель полей

    $8 – указывает на восьмое поле

    %02d – формат, который обрабатывает аргумент функции как 2- разрядный номер


    Обратите внимание , что последнее поле в записи может быть представлено в $NF .

    NF – это предопределенная переменная, значение которой – количество полей в текущей записи

    Таким образом, $NF совпадает с $8 (для вашего ввода)

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

    Вы можете попробовать использовать awk :

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

    Вот решение 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 позволяет обрабатывать входные данные как массивы на основе разделителя, указанного с помощью -F . В основном мы меняем последний элемент в этом массиве и перестраиваем его с помощью команды join .

    С входными данными, такими как:

     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 

    в text.csv

    код ниже

     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 

    производит выход как:

     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 

    Tcl

    Вот мое решение, выполненное с использованием Tcl, которое читает из файла input.csv и помещает результат в файл 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 

    демонстрация

    Interesting Posts

    Помогите написать функцию bash как однострочный псевдоним

    Ошибка создания контейнера LUKS: нет устройства с контуром

    Как заставить Mint распознавать микрофон моего ноутбука как монофонический вход вместо стерео входа?

    Не удается найти исполняемый файл для пользователя без root по ssh

    Какова самая последняя методика реализации квот?

    Cron на Amazon EC2 centos по-прежнему выполняется даже после удаления

    Разрешение на запись в домашнем каталоге

    «Нажмите ENTER или введите команду для продолжения»: почему я вижу это?

    Почему установка внешнего жесткого диска вызывает событие UFW?

    Сценарий Bash с диалогом (X) с запросом пароля root (заменитель kdesu)

    Nautilus: открыть папку в терминале при использовании tmux

    Как получить количество заданной (диапазона) длины из строки с grep?

    Не удалось достичь сети из chroot

    nohup cmd & in i3

    Не могу пинговать машину на eth0; Пункты штрафа на wlan0; Centos 6.5 на Dell D610

    Linux и Unix - лучшая ОС в мире.