Converting a date to friday date and finding Min/Max date


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Converting a date to friday date and finding Min/Max date
# 1  
Old 07-27-2012
Converting a date to friday date and finding Min/Max date

Dear all,

I have 2 questions.

I have a file with many rows which has date of the format YYYYMMDD.

1. I need to change the date to that weeks friday date(Ex: 20120716(monday) to 20120720). Satuday/Sunday has to be changed to next week friday date too.

2. After converting the date to friday date, The Minimum and maximum dates has to be derived.

Kindly help.
Thanks a lot in advance...
# 2  
Old 07-27-2012
Is the only output to be the friday after the min and max dates?

What OS, what shell?
# 3  
Old 07-27-2012
Please post the expected output to match your input.

What does "next week friday date" mean? Please explain.
# 4  
Old 07-27-2012
Quote:
Originally Posted by methyl
Please post the expected output to match your input.

What does "next week friday date" mean? Please explain.
I took it to mean July 28th to be rounded up to August 3rd.

I put those julian date functions into awk, since awk seems to work the same everywhere no matter your shell.

Code:
mute@ovh:~$ printf '%s\n' 20120728 20120726 20120520 | ./julian.awk
Friday after:
Min: 2012/05/25
Max: 2012/08/03

Code:
#!/usr/bin/awk -f

function mk_j(y,m,d,    a, j)
{
        a = int((14 - m) / 12);
        y = y + 4800 - a;
        m = m + 12 * a - 3;
        j = d + int((153*m + 2)/5) + 365*y + int(y/4) - int(y/100) + int(y/400) - 32045
        return j
}

function mk_g(jd,       l,n,i,j,d,m,y)
{
        l = jd + 68569
        n = int(( 4 * l ) / 146097)
        l = l - int(( 146097 * n + 3 ) / 4)
        i = int(4000 * ( l + 1 ) / 1461001)
        l = l - int(( 1461 * i ) / 4) + 31
        j = int(( 80 * l ) / 2447);
        d = l - int(( 2447 * j ) / 80);
        l = int(j / 11);
        m = j + 2 - ( 12 * l );
        y = 100 * ( n - 49 ) + i + l

        return sprintf("%04d/%02d/%02d",y,m,d)
}

{
        y=substr($0,1,4)
        m=substr($0,5,2)
        d=substr($0,7,2)
        dates[++i]=mk_j(y,m,d)
}

function next_fri(jd,   dow) {
        dow = jd % 7
        # friday=4
        return jd + ( (dow > 4) ? 7 : 0 ) + (4 - dow)
}

END {
        min=max=dates[1]
        for (i in dates) {
                if (dates[i] > max) max=dates[i]
                if (dates[i] < min) min=dates[i]
        }

        printf("Friday after:\nMin: %s\nMax: %s\n",
                mk_g(next_fri(min)), mk_g(next_fri(max)));
}

It is a bit lengthy. If only output you want is that next friday, there are day-of-week algorithm that wouldn't require converting to-and-from julian. You could use sort -n on that column and grab the first and last, then depends on OS if you can use date -d to get next friday...

This is bash function for day of week, since GNU date did allow "next friday" but not "2012-07-27 next friday" Smilie

Code:
mkdow() {
        local y=$1 m=$2 d=$3
        echo $((
                ((m<3?y--:y-2)+23*m/9+4+d+y/4+y/100*25/4)%7
        ))
}

could then just add days yourself until it is friday (like next_friday i wrote in awk)
This User Gave Thanks to neutronscott For This Post:
# 5  
Old 07-27-2012
Hi,

another way

inputfile
Code:
20120624
20120625
20120626
20120627
20120628
20120629
20120630
20120701
20120702
20120703
20120704
20120705
20120706
20120707
20120708
20120709
20120710
20120711
20120712
20120713
20120714
20120715
20120716
20120717
20120718
20120719
20120720
20120721
20120722

The code
Code:
awk '{oneday=24*60*60; ctm=mktime(substr($1,1,4) " " substr($1,5,2) " " substr($1,7,2) " 00 00 00"); dow=strftime("%u",ctm); toadd=(dow<=5?5-dow:12-dow)*oneday; print strftime("%Y%m%d",ctm+toadd);}' infile

Output :
Code:
20120629
20120629
20120629
20120629
20120629
20120629
20120706
20120706
20120706
20120706
20120706
20120706
20120706
20120713
20120713
20120713
20120713
20120713
20120713
20120713
20120720
20120720
20120720
20120720
20120720
20120720
20120720
20120727
20120727

# 6  
Old 07-29-2012
Hi All,

Thanks a lot to all for the replies

@neutronscott: Its AIX and Bourne shell i guess.
and we have to calcuate the min and max date for the dates that are present in the data.

@Methy:if the input is as below,
20120711(Wed)
20120719(Thu)
20120721(sat)

Then my output should be like this,
20120713
20120720
20120727(Friday after the saturday)
# 7  
Old 07-29-2012
Have you found a way to incorporate these suggestions into what you need, or do you need more help? If a clear complete sample of input (3 lines maybe) and exact output is given, a complete working example would be more probable. Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Compare date in .txt with system date and remove if it's lesser than system date

Can someone help me with the code wherein there is a file f1.txt with different column and 34 column have expiry date and I need to get that and compare with system date and if expiry date is <system date remove those rows and other rows should be moved to new file f2.txt . I don't want to delete... (2 Replies)
Discussion started by: Stuti
2 Replies

2. Shell Programming and Scripting

Date: invalid date trying to set Linux date in specific format

i try to set linux date & time in specific format but it keep giving me error Example : date "+%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01" or date +"%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01" keep giving me this error : date: invalid date ‘19-01-2017 00:05:01' Please use CODE tags... (7 Replies)
Discussion started by: umen
7 Replies

3. Shell Programming and Scripting

Converting String Date into UNIX Date

Hi, I have a string date to my unix script(sun solaris). I wanted to convert it into unix date so that I can use it in a conditional statement. Please see below: MyTest.sh -s 2018-05-09 suppdt=$1 # string date passed via arguement as 2018-04-09 curryr=`date '+%Y'` nextyr=`expr... (2 Replies)
Discussion started by: Saanvi1
2 Replies

4. Red Hat

How to find/display out last Friday's date of the month?

Hello, Can you please help me find/display out last Friday's date of the month using command in Unix/Linux (3 Replies)
Discussion started by: sunnysthakur
3 Replies

5. Shell Programming and Scripting

finding date numeral from file and check the validity of date format

hi there I have file names in different format as below triss_20111117_fxcb.csv triss_fxcb_20111117.csv xpnl_hypo_reu_miplvdone_11172011.csv xpnl_hypo_reu_miplvdone_11-17-2011.csv xpnl_hypo_reu_miplvdone_20111117.csv xpnl_hypo_reu_miplvdone_20111117xfb.csv... (10 Replies)
Discussion started by: manas_ranjan
10 Replies

6. Shell Programming and Scripting

To get max/min Date/Timestamp from a file

I want to get maximum/minimum date/timestamp from a data file ? Sample Input File ============= rec#,order_dt,ext_ts 1,2010-12-01,2010-12-01 17:55:23.222222 2,2011-11-05,2010-12-01 19:55:23.222222 3,2009-10-01,2010-12-01 18:55:23.222222 for above file Maximum Order_dt = 2011-11-05... (5 Replies)
Discussion started by: vikanna
5 Replies

7. Shell Programming and Scripting

finding the previous day date and creating a file with date

Hi guys, I had a scenario... 1. I had to get the previous days date in yyyymmdd format 2. i had to create a file with Date inthe format yyyymmdd.txt format both are different thanks guys in advance.. (4 Replies)
Discussion started by: apple2685
4 Replies

8. Shell Programming and Scripting

Date One Week Ago From Given Date, Not From Current Date

Hi all, I've used various scripts in the past to work out the date last week from the current date, however I now have a need to work out the date 1 week from a given date. So for example, if I have a date of the 23rd July 2010, I would like a script that can work out that one week back was... (4 Replies)
Discussion started by: Donkey25
4 Replies

9. Shell Programming and Scripting

Get the date of monday when running from Friday to next Thursday

Hi, I have a requirement where I want to get the date of monday when I am running the script from previous Friday to the following Thursday. For example: When ever I run the script between 19thFeb2010(Friday) to 25th Feb 2010(Thursday), I should get the date of 22nd Feb 2010 in the format of... (5 Replies)
Discussion started by: fasiazhar_411
5 Replies

10. HP-UX

a simple way of converting a date in seconds to normal date

Hi all! I'm working on a HPUX system, and I was wondering if there is a simple way to convert a date from seconds (since 1970) to a normal date. Thanks (2 Replies)
Discussion started by: travian
2 Replies
Login or Register to Ask a Question