Programmer
Programmer

Reputation: 439

Adding months using shell script

Currently I have a below record in a file.

ABC,XYZ,123,Sep-2018

Looking for a command in linux which will add months and give the output. For example If I want to add 3 months. Expected output is:

ABC,XYZ,123,Dec-2018

Upvotes: 0

Views: 466

Answers (2)

Tony Williams
Tony Williams

Reputation: 647

Well,

date -d "1-$(echo "ABC,XYZ,123,Sep-2018" | awk -F ","  '{ print $4 }')+3 months" "+%b-%Y"

(Careful, that code continues past the edge of the box.)

Shows you how to get it working. Just replace the echo with a shell variable as you loop through the dates.

Basically, you use awk to grab just the date portion, add a 1- to the front to turn it into a real date then use the date command to do the math and then tell it to give you just the month abbreviation and year.

The line above gives just the date portion. The first part can be found using:

stub=`echo "ABC,XYZ,123,Dec-2018" | awk -F ","  '{ printf("%s,%s,%s,",$1,$2,$3) }'`

Upvotes: 2

Kent
Kent

Reputation: 195209

You can use external date or (g)awk's datetime related function to do it. However you have to prepare the string to parse. Here is another way to do the job:

First prepare an index file, we name it month.txt:

Jan
Feb
......
...
Nov
Dec

Then run this:

awk -F'-|,' -v OFS="," 'NR==FNR{m[NR]=$1;a[$1]=NR;next}
    {i=a[$4]; if(i==12){i=1;++$5}else i++
    $4=m[i]"-"$5;NF--}7' month.txt file

With this example file:

ABC,XYZ,123,Jan-2018
ABC,XYZ,123,Nov-2018
ABC,XYZ,123,Dec-2018

You will get:

ABC,XYZ,123,Feb-2018
ABC,XYZ,123,Dec-2018
ABC,XYZ,123,Jan-2019

update

Oh, I didn't notice that you want to add 3 months. Here is the updated codes for it:

 awk -F'-|,' -v OFS="," 'NR==FNR{m[NR]=$1;a[$1]=NR;next}
    {i=a[$4]+3; if(i>12){i=i-12;++$5}
    $4=m[i]"-"$5;NF--}7' month.txt file

Now with the same input, you get:

ABC,XYZ,123,Apr-2018
ABC,XYZ,123,Feb-2019
ABC,XYZ,123,Mar-2019

Upvotes: 1

Related Questions