У меня есть огромный текстовый файл, который выглядит примерно так:
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