새 날짜 열을 생성하려면 주간 누계 열을 추가하세요.

새 날짜 열을 생성하려면 주간 누계 열을 추가하세요.

다음과 같이 100개의 날짜(dd/mm/yyyy)가 포함된 파일이 있습니다.

10112017
23012012
01022008

Bash에서 다음과 같은 출력을 얻으려면 이 날짜에 8주를 추가해야 합니다.

10112017 05012018
23012012 19032012
01022008 28032008

아마도 awk일 수도 있고 p를 읽을 때 시작되는 것일 수도 있지만 원하는 출력을 얻을 수 없을 수도 있습니다.

도움을 주셔서 감사합니다.

답변1

Perl과 모듈을 사용할 수 있습니다 Time::Piece.

perl -MTime::Piece -MTime::Seconds -lpe '
  $dt = Time::Piece->strptime($_,"%d%m%Y") + 8 * ONE_WEEK; 
  $_ .= $dt->strftime(" %d%m%Y")
' file
10112017 05012018
23012012 19032012
01022008 28032008

또는 GNU awk( gawk) 및 GNU를 사용하십시오.date

gawk -v FIELDWIDTHS='2 2 4' '{
    cmd = sprintf("date +%%d%%m%%Y -d \"%s/%s/%s + 8 weeks\"", $2, $1, $3); 
    cmd |& getline dt; 
    close(cmd)
  } 
  {
    print $0,dt
  }
' file
10112017 05012018
23012012 19032012
01022008 28032008

아니면 (내가 가장 좋아하는 것),밀러

$ mlr --nidx put -S '$2 = strftime(strptime($1,"%d%m%Y") + 4838400,"%d%m%Y")' file
10112017 05012018
23012012 19032012
01022008 28032008

8 4838400주는 초 단위입니다(3600 x 24 x 7 x 8).

답변2

]# date -d '2020-2-1 +8 week' +%Y-%m-%d
2020-03-28

]# date -d '2019-2-1 +8 week' +%Y-%m-%d
2019-03-29

]# date -d '2019-7-1 +8 week' +%Y-%m-%d
2019-08-26

info date몇 가지 추가 예가 있습니다. DDMMYYYY 양식에서는 작동하지 않는 YYYY-MM-DD 표기법을 사용했습니다.

이것은 GNU 입니다 date. 이 예에서는 월 길이와 윤년이 유효함을 보여줍니다.

date기본 달력 처리 도구 포함 . 아마도 이를 스크립트에 통합하는 더 좋은 방법이 있을 수 있습니다. 입력 "DDMMYYYY"에는 (?) 처리가 필요하다는 것을 알 수 있습니다.

출력 형식을 +%Y-%m-%d로 변경할 수 있습니다 +%d%m%Y.

답변3

아래에 주석이 달린 bash 스크립트. 다음과 같이 실행하십시오: ./script.sh < inputfile > outputfile.

#!/bin/bash

# date1 is orignal date string in 1st column
# date2 is 8 weeks later than date1

while read date1 ; do

    # Skip emtpy lines
    #
    [ "$date1" ] || continue

    # We want to use 'date' command to calculate 8 weeks later.
    # However the 'date' command does not accept 'ddmmyyyy', but it
    # does accept 'yyyy-mm-dd'. So we need to convert first.
    #
    dd=${date1%??????}
    mm=${date1#??} ; mm=${mm%????}
    yyyy=${date1#????}

    # The 'date' command does have its own option to specify output
    # format of the date. It also just lets specify the input date
    # like this: "1983-04-18 + 8 weeks" to have it calculate what we
    # need here.
    #
    date2=$(date -d "${yyyy}-${mm}-${dd} + 8 weeks" +'%d%m%Y')

    # Now just output both dates on one line
    #
    echo $date1 $date2

done

관련 정보