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