조건부 필드에 추가

조건부 필드에 추가

입력하다:

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로 사용해야 합니다.

관련 정보