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

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

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

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 

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

  • Сценарий оболочки, чтобы стать root
  • Простой «переменный» файл Bash
  • как войти с помощью ssh с паролем?
  • Терминал Ubuntu закрывается после запуска скрипта
  • Как пронумеровать строку в каждой строке файла
  • Почему sed не удаляет мои пустые строки?
  • Как захватить вывод из команды в сценарии оболочки
  • Изменить разрешение папки на основе list.txt
  • Как я могу захватить статус возврата и использовать тройник одновременно в оболочке korn?
  • переменная pass в ssh
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Linux и Unix - лучшая ОС в мире.