dnat
April 13, 2018, 1:00pm
1
Hi,
I have a scenario like this.
I get a file on anyday of the week, so the file name is like this.
FILE_NAME_YYYYMMDD
I want to get the tuesday date before this day.
For example
FILE_NAME_20180413
I should get the date as 20180410
FILE_NAME_20180404
I should get the date as 20180403
Ho could I do that?
Thanks!!
What operating system are you using (including release number)?
What shell are you using (including version number)?
If you have a filename like FILE_NAME_20180410
, what date do you want? 20180410
or 20180403
?
What have you tried to solve this problem on your own?
dnat
April 13, 2018, 5:28pm
3
Hi,
I am using Korn shell AIX ver 7.1
I tried this , but its giving me an error : date: illegal option -- d
date -d "$d -$(date -d $d +2) days" +"%m-%d-%Y"
If FILE_NAME_20180410
then I would need 20180410
.
Thanks!
Yoda
April 13, 2018, 10:15pm
4
If you have python installed, here is an approach:-
import datetime
def previous_weekday(day, weekday):
days_behind = weekday - day.weekday()
if days_behind >= 0:
days_behind -= 7
return day + datetime.timedelta(days_behind)
files = ['FILE_NAME_20180413','FILE_NAME_20180404','FILE_NAME_20180410']
for file in files:
day = datetime.date(int(file[10:-4]), int(file[14:-2]), int(file[16:]))
# 0 - Monday, 1 - Tuesday ...
if day.weekday() == 1:
print(file, day.strftime("%Y%m%d"))
else:
prev_tuesday = previous_weekday(day, 1)
print(file, prev_tuesday.strftime("%Y%m%d"))
Produces output:-
('FILE_NAME_20180413', '20180410')
('FILE_NAME_20180404', '20180403')
('FILE_NAME_20180410', '20180410')
I asked what version of shell you're using, but you didn't provide an answer to that question. With a recent Korn shell, such as version 93u+, (which may be installed as ksh93
on AIX 7.1) you could try a simplified version of:
for file in "$@"
do fd=${file##*_}
printf 'File: %s: %(%a(%w), %Y-%m-%d)T, Previous Tuesday: %(%Y%m%d\n)T' \
"$file" "$fd" "$fd $((($(printf '%(%u)T' "$fd")+5)%7)) days ago"
done
which if invoked with the operands FILE_NAME_20180410
, FILE_NAME_20180413
, and FILE_NAME_20180409
produces the output:
File: FILE_NAME_20180410: Tue(2), 2018-04-10, Previous Tuesday: 20180410
File: FILE_NAME_20180413: Fri(5), 2018-04-13, Previous Tuesday: 20180410
File: FILE_NAME_20180409: Mon(1), 2018-04-09, Previous Tuesday: 20180403
1 Like
dnat:
...
I get a file on anyday of the week, so the file name is like this.
FILE_NAME_YYYYMMDD
I want to get the tuesday date before this day.
...
What if the date in the file name falls on a Tuesday itself? (e.g. "FILE_NAME_20180417")
I assume, in that case, you want the same date returned, rather than the previous week's Tuesday.
Using Perl's core module Time::Piece, here is a way to do it:
$
$ #
$ echo "FILE_NAME_20180413" |
perl -lne 'BEGIN {use Time::Piece}
($x = $_) =~ s/^.*_//;
$t = Time::Piece->strptime($x, "%Y%m%d");
$weekday = $t->wday;
$delta = 3 - $weekday;
if ($weekday < 3) { $delta -= 7 };
$t += 24*60*60*$delta;
print $t->strftime("%Y%m%d");
'
20180410
$
$
And some more testing is done here.
$
$ # Generate some test data
$ perl -le 'BEGIN {use Time::Piece}
sub get_prev_tuesday {
($x = shift) =~ s/^.*_//;
$t = Time::Piece->strptime($x, "%Y%m%d");
$weekday = $t->wday;
$delta = 3 - $weekday;
if ($weekday < 3) { $delta -= 7 };
$t += 24*60*60*$delta;
return $t->strftime("%Y%m%d");
}
# Generate a list of filenames for testing
$start_date = Time::Piece->strptime("20180401", "%Y%m%d");
foreach $offset (0..29) {
$date = $start_date + 24*60*60*$offset;
$file_name = "FILE_NAME_".$date->strftime("%Y%m%d");
$val = get_prev_tuesday($file_name);
print $file_name, " => ", $val;
}
'
FILE_NAME_20180401 => 20180327
FILE_NAME_20180402 => 20180327
FILE_NAME_20180403 => 20180403
FILE_NAME_20180404 => 20180403
FILE_NAME_20180405 => 20180403
FILE_NAME_20180406 => 20180403
FILE_NAME_20180407 => 20180403
FILE_NAME_20180408 => 20180403
FILE_NAME_20180409 => 20180403
FILE_NAME_20180410 => 20180410
FILE_NAME_20180411 => 20180410
FILE_NAME_20180412 => 20180410
FILE_NAME_20180413 => 20180410
FILE_NAME_20180414 => 20180410
FILE_NAME_20180415 => 20180410
FILE_NAME_20180416 => 20180410
FILE_NAME_20180417 => 20180417
FILE_NAME_20180418 => 20180417
FILE_NAME_20180419 => 20180417
FILE_NAME_20180420 => 20180417
FILE_NAME_20180421 => 20180417
FILE_NAME_20180422 => 20180417
FILE_NAME_20180423 => 20180417
FILE_NAME_20180424 => 20180424
FILE_NAME_20180425 => 20180424
FILE_NAME_20180426 => 20180424
FILE_NAME_20180427 => 20180424
FILE_NAME_20180428 => 20180424
FILE_NAME_20180429 => 20180424
FILE_NAME_20180430 => 20180424
$
$