다음과 같이 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