Tcl

Tcl

다음과 같은 거대한 텍스트 파일이 있습니다.

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 솔루션을 모두 원했습니다.) 흥미로운 답변이 있습니다.

답변1

으로 접근하다스프린트함수(앞에 0을 추가하려면):

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

답변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 파일에 저장하는 Tcl을 사용하여 수행된 내 솔루션입니다.

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

데모

관련 정보