입력하다:
1,2,20,11
1,1,2018,111
산출:
1,02,20,11
1,01,18,111
0
단일 숫자인 경우 필드 2(월)에 삽입하고 싶습니다 .
4자리인 경우 필드 3(연도)에서 처음 2자리를 제거하려고 합니다.
답변1
사용 awk
:
awk -F, -v OFS=, ' { $2 = sprintf("%02d", $2) }
length($3) == 4 { sub("^[0-9][0-9]", "", $3) } 1' file
이는 무조건 두 번째 쉼표로 구분된 필드를 0으로 채워진 두 자리 정수로 다시 포맷합니다. 세 번째 필드의 길이가 4자인 경우 처음 두 자리가 제거됩니다. 그런 다음 결과 기록을 인쇄하십시오.
답변2
사용 awk
:
awk -F, '{ printf("%d,%02d,%d\n" ,$1, $2, substr($3, length($3)-1) ) }' infile
length($3)
반환 길이를-1
만드는 데 사용된 열 3의 길이를 반환합니다.substr($3, START[, LEN])
런던끝에서 두 번째 숫자 위치부터 시작하는 문자는 다음과 같습니다.시작(지금입니다length($3)-1
). 선택사항인 경우런던나머지는 생략시작사용된.
편집하다수정된 질문의 경우(이제 4개의 열이 있습니다.):
awk -F, '{
printf("%d,%02d,%d%s\n" ,$1, $2, substr($3, length($3)-1), ($4?","$4:"") )
}' OFS= infile
일반적인 경우 N개의 열(적어도 3):
awk -F, '{
printf("%d,%02d,%d" ,$1, $2, substr($3, length($3)-1) ) }
{ $1=$2=$3=""; printf ("%s\n", (NF>3?","$0:"") ) }' OFS= infile
답변3
input file
1,2,20,11
1,1,2018,111
주문하다
awk -F ',' '{if(length($2)==1)$2="0"$2;print $0}' inputfile | awk '{if(length($3)==4)$3=substr($3,3,2);print $0}'| sed 's/ /,/g'
산출
1,02,20,11
1,01,18,111
답변4
이 상황을 처리하는 한 가지 방법은 다음과 같습니다.
주문하다
perl -pe 's|^\d+,\K(\d)?(\d),(\d\d)(\d\d)?(?=,)|($1//0)."$2,".($4//$3)|e' input.txt
산출
1,02,20,11
1,01,18,111
설명하다:
s|
^\d+,\K(?#은 왼쪽에 첫 번째 쉼표로 구분된 필드를 유지함)(?# $1 $2) (\d)?(\d), (?#은 숫자 뒤에 명확한 숫자가 올 수 있음)
(?# $3 $4) (\d\d)(\d\d)? (?# 두 숫자 뒤에 두 개의 숫자가 있을 수 있음)
(?=,) (?# 오른쪽에 쉼표가 표시됩니다)
|($1//0)."$2,".($4//$3)|e
($1 // 0)은 $1이 정의되지 않은 경우 0을 사용한다는 의미입니다. IOW, 필드 2는 한 자리입니다. ($4 // $3)은 $4가 정의되지 않은 경우 $3을 사용하고 IOW에서 비트 수에 따라 두 튜플 중 하나를 선택하는 것을 의미합니다.
s/// 명령의 /e 플래그는 RHS를 Perl 코드로 취급하고 제공된 인수를 사용하여 이를 평가하고 이 평가 결과를 s/// 명령의 RHS로 사용해야 합니다.