다음과 같은 거대한 텍스트 파일이 있습니다.
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