쉘 스크립트를 통해 .csv 파일의 날짜를 -7일로 수정합니다.

쉘 스크립트를 통해 .csv 파일의 날짜를 -7일로 수정합니다.

다음 형식의 레코드가 포함된 파일이 있습니다.

D20200826,S2927,977,1

예상 출력:

D20200819,S2927,977,1

이제 제가 달성하고 싶은 것은 어떻게든 날짜(첫 번째 열)를 지난 7일로 이동할 수 있는지입니다. 즉, 현재 날짜가 29일 경우 22일이 되도록 하고 싶습니다.

답변1

awk시간 관련 함수 mktime()strftime()( mawk또는 GNU awk) 가 있다고 가정하면 awk스크립트는

BEGIN {
        OFS = FS = ","
}

{
        t = mktime(sprintf("%4d %.2d %.2d 00 00 00",
                substr($1,2,4),
                substr($1,6,2),
                substr($1,8,2)));

        $1 = substr($1,1,1) strftime("%Y%m%d", t - 7*24*60*60)

        print
}

여러 호출을 사용하여 첫 번째 쉼표로 구분된 열의 ​​날짜 사양을 분석 substr()하고 를 사용합니다 mktime().

YYYYMMDD그런 다음 결과 타임스탬프 를 7일(초 단위)만큼 줄이고 strftime(). 그런 다음 결과 날짜 문자열은 수정된 전체 행을 인쇄하기 전에 D첫 번째 열 데이터의 첫 번째 문자(예에서는 a)와 함께 첫 번째 열에 할당됩니다 .

일부 데이터에 대해 위 스크립트를 테스트합니다.

$ cat file
D20200826,S2927,977,1
D20200106,S2927,977,1
$ awk -f script.awk file
D20200819,S2927,977,1
D20191230,S2927,977,1

약간 더 짧은 변형:

BEGIN { OFS = FS = "," }

{
        $1 = substr($1,1,1) strftime("%Y%m%d",
                mktime(sprintf("%4d %.2d %.2d 00 00 00",
                        substr($1,2,4),
                        substr($1,6,2),
                        substr($1,8,2))) - 7*24*60*60)
}

1

그리고 "한 줄"로:

awk -F, '{ $1 = substr($1,1,1) strftime("%Y%m%d",mktime(sprintf("%4d %.2d %.2d 00 00 00",substr($1,2,4),substr($1,6,2),substr($1,8,2)))-7*24*60*60) }; 1' OFS="," file

답변2

멍하니 있을 뿐

awk -F, '{$1 = strftime("D%Y%m%d",\
mktime(gensub(/.(.{4})(.{2})(.{2})/, "\\1 \\2 \\3 0 0 0", 1, $1))-7*3600*24)}1' OFS=, file

관련 정보