Тсл

Тсл

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

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, так и решения batch/powershell для этого.) там есть интересные ответы.

решение1

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

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это то же самое, что $8(для вашего ввода)

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

решение2

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

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

решение3

Вот решение на 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команды.

решение4

Тсл

Вот мое решение, реализованное с помощью 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

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

Связанный контент