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

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

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-решения), в котором есть интересные ответы.

  • Как запустить исполняемый файл Windows в сценарии оболочки Linux?
  • Получить путь к текущему отмеченному файлу
  • Простой сценарий bash для резервного копирования и удаления каталогов
  • Использование параметров в скрипте
  • Поиск текстового файла по столбцу
  • Невозможно запустить сценарий tmux при загрузке
  • Как извлечь дату и рассчитать, находится ли она в течение «х» дней с сегодняшнего дня?
  • При обработке входных файлов происходит копирование / обновление и переименование действительного подхода?
  • 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

    Rsync для копирования определенных подпапок и файлов в новый каталог

    Команды, которые я могу использовать, чтобы определить, кто вошел в систему на определенном терминале?

    Переместить / в новый раздел

    Преобразование времени unix из переменной в обычное время в AIX

    Не использовать определенные области памяти из-за ошибок

    Что такое активация планировщика?

    Как сообщить systemd-logind, что сеанс не простаивает, без использования среды рабочего стола или диспетчера сеансов?

    Режим n на "iwlist wlan0 scan"

    Как одновременно воспроизводить звуки в системе объемного звучания 4.0 с использованием aplay

    Регистрация SSH в Linux через PUTTY

    rsync-фильтр на основе промежуточного имени каталога

    Как добавить пользователя в SVN?

    Сценарий мониторинга для сервера redis

    Как сделать PulseAudio и OSS только приложения сосуществуют на Debian Wheezy?

    Группируйте содержимое файла двумя полями и суммируйте третье поле

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