Unix/Linux Go Back    


UNIX for Beginners Questions & Answers If you're not sure where to post a Unix or Linux question, post it here. All unix and Linux beginners welcome in this forum!

Parsing a column of text file - best practices

UNIX for Beginners Questions & Answers


Reply    
 
Thread Tools Search this Thread Display Modes
    #8  
Old Unix and Linux 05-20-2017   -   Original Discussion by SIMMS7400
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is online now Forum Staff  
Administrator
 
Join Date: Jul 2012
Last Activity: 18 November 2017, 6:16 PM EST
Location: San Jose, CA, USA
Posts: 10,651
Thanks: 571
Thanked 3,729 Times in 3,183 Posts
So, the question boils down to what operating system are you running? (If Linux or you have access to the GNU date utility, you can use what Scrutinizer suggested. If not, do you have access to a recent version of the Korn shell (93u+ or later)? If so, you can use ksh's printf built-in's %(format)T format specifier to do the same thing. If not, do you have perl installed. ...) We need to know the environment you're using to tell you how to get what you want as easily as possible.
The Following User Says Thank You to Don Cragun For This Useful Post:
SIMMS7400 (05-20-2017)
Sponsored Links
    #9  
Old Unix and Linux 05-21-2017   -   Original Discussion by SIMMS7400
SIMMS7400 SIMMS7400 is offline
Registered User
 
Join Date: Apr 2016
Last Activity: 17 November 2017, 7:24 AM EST
Posts: 143
Thanks: 35
Thanked 3 Times in 3 Posts
Hi Don -

Thank you.

So it's Linux, therefore I've been able to use Scrutinzer's solution with success:


Code:
echo $(date +CurrentWeek,%m/%d/%y)
echo $(date +CurrentWeekq,'"%m/%d/%y"')
echo $(date +CurrentPeriod,%^b%y)
echo $(date +CurrentPeriodq,'"%^b%y"')
echo $(date +1PeriodPrior,%^b%y)
echo $(date +1PeriodPriorq,'"%^b%y"' --date='1 month ago')
echo $(date +2PeriodPrior,%^b%y)
echo $(date +2PeriodPriorq,'"%^b%y"' --date='2 months ago')
echo $(date +CurrentPlanYear,"FY %Y")
echo $(date +CurrentPlanYearq,'"FY %Y"')

SO thank you both!

I do have a few more questions as to how to grab certain values.

Here are the additional variables:


Code:
CurrentQuarter,FY 2Q2017
CurrentQuarterq,"FY 2Q2017"
PriorQuarter,FY 1Q2017
PriorQuarterq,"FY 1Q2017"

PriorQuarterMnth1,JAN17
PriorQuarterMnth2,FAB17
PriorQuarterMnth3,MAR17
PriorQuarterMnth1q,"JAN17"
PriorQuarterMnth2q,"FEB17"
PriorQuarterMnth3q,"MAR17"

CurrentHalf,FY 1H2017
CurrentHalfq,"FY 1H2017"

I have the following code for the Current and Prior quarters, but I need help putting the output in the correct format (as shown above):


Code:
echo $(date +"%Y %m" | awk '{q=int($2/4)+1; printf("%sq%s\n", $1, q);}')
echo $(date +"%Y %m" | awk '{q=int($2/4);y=$1;if (q==0){q=4;y=y-1;}; printf("%sq%s\n", y, q);}')

As you can see, I also need help deriving PriorQuarter months 1-3.

Thank you for all your help!!

---------- Post updated 05-21-17 at 12:30 AM ---------- Previous update was 05-20-17 at 09:04 PM ----------

Hi -

Based on your suggestions, I've been able to acheeive my goal. However, I did need to use some if logic to get get there which helps with PriorQuarter Months 1-3 as well as prior year when in Quarter 1.

Please let me know if there is a better way, as I'm sure there is. Here is my code,
thanks!

_CH= Current Half
_PQ=Prior Quarter
_PQM1= Prior Quarter Month 1


Code:
echo ---------------------------------------------------------                                                                                                
echo "Advance Subvar Values"                                         
echo ---------------------------------------------------------

if [ $(($(date +%m)/4+1)) -eq 1 ]
then
    _CH=1
    _PQ=4
    _PQM1=OCT
    _PQM2=NOV
    _PQM3=DEC
    _SVYEARL=$(date +%Y --date="1 year ago")
    _SVYEARS=$(date +%y --date="1 year ago")
elif [ $(($(date +%m)/4+1)) -eq 2 ]
then
    _CH=1
    _PQM1=JAN
    _PQM2=FEB
    _PQM3=MAR
    _SVYEARL=$(date +%Y)
    _SVYEARS=$(date +%y)
elif [ $(($(date +%m)/4+1)) -eq 3 ]
then
    _CH=2
    _PQM1=APR
    _PQM2=MAY
    _PQM3=JUN
    _SVYEARL=$(date +%Y)
    _SVYEARS=$(date +%y)
elif [ $(($(date +%m)/4+1)) -eq 4 ]
then
    _CH=2
    _PQM1=JUL
    _PQM2=AUG
    _PQM3=SEP
    _SVYEARL=$(date +%Y)
    _SVYEARS=$(date +%y)
else
    _PQ=$(($(($(date +%m)/4+1))-1))
fi

#::-- Read file contents into variables and pass to MaxL --::#

echo $(date +CurrentWeek,%m/%d/%y)
echo $(date +CurrentWeekq,'"%m/%d/%y"')
echo $(date +CurrentPeriod,%^b%y)
echo $(date +CurrentPeriodq,'"%^b%y"')
echo $(date +1PeriodPrior,%^b%y)
echo $(date +1PeriodPriorq,'"%^b%y"' --date='1 month ago')
echo $(date +2PeriodPrior,%^b%y)
echo $(date +2PeriodPriorq,'"%^b%y"' --date='2 months ago')
echo $(date +CurrentQuarter,"FY $(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)Q%Y")
echo $(date +CurrentQuarterq,'"'"FY $(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)Q%Y"'"')
echo $(date +CurrentHalfq,'"'"FY ${_CH}H%Y"'"')
echo $(date +CurrentPlanYear,"FY %Y")
echo $(date +CurrentPlanYearq,'"FY %Y"')
echo $(date +CurrentYear,"FY %Y")
echo $(date +CurrentYearq,'"FY %Y"')
echo $(date +PriorQuarterAD,AD${_PQ}-${_SVYEARS})
echo $(date +PriorQuarterADq,'"'"AD${_PQ}-${_SVYEARS}"'"')
echo $(date +PriorQuarterMnth1,"${_PQM1}${_SVYEARS}")
echo $(date +PriorQuarterMnth2,"${_PQM2}${_SVYEARS}")
echo $(date +PriorQuarterMnth3,"${_PQM3}${_SVYEARS}")
echo $(date +PriorQuarterMnth1q,'"'"${_PQM1}${_SVYEARS}"'"')
echo $(date +PriorQuarterMnth2q,'"'"${_PQM2}${_SVYEARS}"'"')
echo $(date +PriorQuarterMnth3q,'"'"${_PQM3}${_SVYEARS}"'"')
echo $(date +PriorQuarter,"FY ${_PQ}Q${_SVYEARL}")
echo $(date +PriorQuarterq,'"'"FY ${_PQ}Q${_SVYEARL}"'"')
echo $(date +CurrentQtrInput,"FY $(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)Q%Y_input")
echo $(date +CurrentQtrInputq,'"'"FY $(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)Q%Y_input"'"')
echo $(date +PriorQtrInput,"FY ${_PQ}Q${_SVYEARL}_input")
echo $(date +ALLC_CurrentWeek,%m/%d/%y)
echo $(date +ALLC_CurrentWeekq,'"%m/%d/%y"')
echo $(date +ALLC_CurrentPeriod,%^b%y)
echo $(date +ALLC_CurrentPeriodq,'"%^b%y"')


Last edited by SIMMS7400; 05-20-2017 at 10:55 PM..
Sponsored Links
    #10  
Old Unix and Linux 05-21-2017   -   Original Discussion by SIMMS7400
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is online now Forum Staff  
Administrator
 
Join Date: Jul 2012
Last Activity: 18 November 2017, 6:16 PM EST
Location: San Jose, CA, USA
Posts: 10,651
Thanks: 571
Thanked 3,729 Times in 3,183 Posts
Quote:
Originally Posted by SIMMS7400 View Post
Hi Don -

Thank you.

So it's Linux, therefore I've been able to use Scrutinzer's solution with success:


Code:
echo $(date +CurrentWeek,%m/%d/%y)
echo $(date +CurrentWeekq,'"%m/%d/%y"')
echo $(date +CurrentPeriod,%^b%y)
echo $(date +CurrentPeriodq,'"%^b%y"')
echo $(date +1PeriodPrior,%^b%y)
echo $(date +1PeriodPriorq,'"%^b%y"' --date='1 month ago')
echo $(date +2PeriodPrior,%^b%y)
echo $(date +2PeriodPriorq,'"%^b%y"' --date='2 months ago')
echo $(date +CurrentPlanYear,"FY %Y")
echo $(date +CurrentPlanYearq,'"FY %Y"')

SO thank you both!

I do have a few more questions as to how to grab certain values.

Here are the additional variables:


Code:
CurrentQuarter,FY 2Q2017
CurrentQuarterq,"FY 2Q2017"
PriorQuarter,FY 1Q2017
PriorQuarterq,"FY 1Q2017"

PriorQuarterMnth1,JAN17
PriorQuarterMnth2,FAB17
PriorQuarterMnth3,MAR17
PriorQuarterMnth1q,"JAN17"
PriorQuarterMnth2q,"FEB17"
PriorQuarterMnth3q,"MAR17"

CurrentHalf,FY 1H2017
CurrentHalfq,"FY 1H2017"

I have the following code for the Current and Prior quarters, but I need help putting the output in the correct format (as shown above):


Code:
echo $(date +"%Y %m" | awk '{q=int($2/4)+1; printf("%sq%s\n", $1, q);}')
echo $(date +"%Y %m" | awk '{q=int($2/4);y=$1;if (q==0){q=4;y=y-1;}; printf("%sq%s\n", y, q);}')

As you can see, I also need help deriving PriorQuarter months 1-3.

Thank you for all your help!!
You seem to need some help calculating the quarter as well as the months in a quarter. Three are three months in a quarter; not 4. If you want to know what calendar quarter a given month is in, try:

Code:
quarter=$(((month+2)/3))

Note that if you're using bash (and some other shells) as your shell, the above calculation will fail in August and September if $month contains a leading zero. If you're using ksh, a leading zero won't be a problem. With the GNU date utility, you can get the month number without a leading zero with:

Code:
month=$(date +%-m)

or with any date utility and any shell that supports parameter substitutions required by the POSIX standards:

Code:
month=$(date +%m)
month=${month#0}

To find months 1, 2, and 3 in a quarter, try:

Code:
month1=$((quarter*3-2))
month2=$((quarter*3-1))
month3=$((quarter*3))

Second note that to work properly, I think you'd need to change two of Scrutinizer's suggestions:

Code:
echo $(date +1PeriodPrior,%^b%y)
echo $(date +1PeriodPriorq,'"%^b%y"' --date='1 month ago')
echo $(date +2PeriodPrior,%^b%y)
echo $(date +2PeriodPriorq,'"%^b%y"' --date='2 months ago')

to:

Code:
echo $(date +1PeriodPrior,%^b%y --date='1 month ago')
echo $(date +1PeriodPriorq,'"%^b%y"' --date='1 month ago')
echo $(date +2PeriodPrior,%^b%y) --date='2 months ago'
echo $(date +2PeriodPriorq,'"%^b%y"' --date='2 months ago')

    #11  
Old Unix and Linux 05-21-2017   -   Original Discussion by SIMMS7400
SIMMS7400 SIMMS7400 is offline
Registered User
 
Join Date: Apr 2016
Last Activity: 17 November 2017, 7:24 AM EST
Posts: 143
Thanks: 35
Thanked 3 Times in 3 Posts
Hi Don -

Thank you!

Where are you seeing 4months in a quarter for 3?

My if logic is checking what quarter I'm currently in:


Code:
if [ $(($(date +%m)/4+1)) -eq 1 ]
then

Is that what you meant?

---------- Post updated at 07:59 AM ---------- Previous update was at 07:39 AM ----------

Also, what would be the best way to derive these two values?


Code:
FirstQtrWeek,12/31/16
LastQtrWeek,03/25/17

My week starts on a Saturday.

Thanks!
Sponsored Links
    #12  
Old Unix and Linux 05-21-2017   -   Original Discussion by SIMMS7400
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is online now Forum Staff  
Administrator
 
Join Date: Jul 2012
Last Activity: 18 November 2017, 6:16 PM EST
Location: San Jose, CA, USA
Posts: 10,651
Thanks: 571
Thanked 3,729 Times in 3,183 Posts
Quote:
Originally Posted by SIMMS7400 View Post
Hi Don -

Thank you!

Where are you seeing 4months in a quarter for 3?

My if logic is checking what quarter I'm currently in:


Code:
if [ $(($(date +%m)/4+1)) -eq 1 ]
then

Is that what you meant?
Hi SIMMS7400,
No. That code had not been presented in the mail to which I responded. But we can use it for discussion now. Although the code above happens to work because there is no month zero. Let's look at the tests for the other three quarters:

Code:
if [ $(($(date +%m)/4+1)) -eq 1 ]
... # Happens to work for months 01, 02, and 03
elif [ $(($(date +%m)/4+1)) -eq 2 ]
... # Treats months 04, 05, 06, and 07 as 2nd quarter.
elif [ $(($(date +%m)/4+1)) -eq 3 ]
... # With ksh, treats months 08, 09, 10, and 11 as 3rd quarter.
... # With bash, treats months 08 and 09 as syntax errors and treats months
... #   10 and 11 as 3rd quarter.
elif [ $(($(date +%m)/4+1)) -eq 4 ]
... # With ksh, treats month 12 as 4th quarter.
... # With bash, treats 08 and 09 as syntax errors and treats 12 as 4th quarter.

Everything marked in red in the comments above look wrong to me! Do you believe that October and November should be in 3rd quarter instead of the 4th quarter? Do you believe that July should be in the 2nd quarter instead of the 3rd quarter? What shell are you using? If you're using bash, do you believe that August and September should not be in any quarter in a calendar year?

I believe that Q1 should be months January, February, and March; Q2 should be months April, May, and June; Q3 should be months July, August, and September; and Q3 should be months October, November, and December. That is not what your code does!
Quote:
---------- Post updated at 07:59 AM ---------- Previous update was at 07:39 AM ----------

Also, what would be the best way to derive these two values?


Code:
FirstQtrWeek,12/31/16
LastQtrWeek,03/25/17

My week starts on a Saturday.

Thanks!
Define your terms!
Is FirstQtrWeek supposed to be the 1st Saturday before January 2, of the current year?

Is LastQtrWeek supposed to be the 1st Saturday before XX/02/YYYY where XX is the 1st month of the current quarter in calendar year YYYY?

And, I repeat, what shell are you using?
Sponsored Links
    #13  
Old Unix and Linux 05-21-2017   -   Original Discussion by SIMMS7400
SIMMS7400 SIMMS7400 is offline
Registered User
 
Join Date: Apr 2016
Last Activity: 17 November 2017, 7:24 AM EST
Posts: 143
Thanks: 35
Thanked 3 Times in 3 Posts
Hi DOn -

Thank you for the replies! I'm operating on a AIX environment.

Since the quarter syntax is whacky, what would you suggest instead? My thoughts are to still utilize the if/elif logic, but instead use month instead. While there would be more conditions using month, it seems safer.

As far as :
FirstQtrWeek : The script should determine if it it the first Saturday of the 1st quarter month. If so, set it. If not, it needs to refer to that week until the next quarter.

& LastQtrWeek,the script should determine if it is the 3rd quarter month of the current quarter, and then determine if it is the last Saturday.

I hope I explained that well enough?

---------- Post updated at 08:50 PM ---------- Previous update was at 08:06 PM ----------

I wrote the quarter derivation portion like this:


Code:
if [[ $(date +%-m) -ge 1 && $(date +%-m) -le 3 ]]
then
    _CH=1
    _PQ=4
    _PQM1=OCT
    _PQM2=NOV
    _PQM3=DEC
    _SVYEARL=$(date +%Y --date="1 year ago")
    _SVYEARS=$(date +%y --date="1 year ago")
elif [[ $(date +%-m) -ge 4 && $(date +%-m) -le 6 ]]
then
    _CH=1
    _PQM1=JAN
    _PQM2=FEB
    _PQM3=MAR
    _SVYEARL=$(date +%Y)
    _SVYEARS=$(date +%y)
    _PQ=$(($(($(date +%-m)/4+1))-1))
elif [[ $(date +%-m) -ge 7 && $(date +%-m) -le 9 ]]
then
    _CH=2
    _PQM1=APR
    _PQM2=MAY
    _PQM3=JUN
    _SVYEARL=$(date +%Y)
    _SVYEARS=$(date +%y)
    _PQ=$(($(($(date +%-m)/4+1))-1))
elif [[ $(date +%-m) -ge 10 && $(date +%-m) -le 12 ]]
then
    _CH=2
    _PQM1=JUL
    _PQM2=AUG
    _PQM3=SEP
    _SVYEARL=$(date +%Y)
    _SVYEARS=$(date +%y)
    _PQ=$(($(($(date +%-m)/4+1))-1))
fi

Sponsored Links
    #14  
Old Unix and Linux 05-22-2017   -   Original Discussion by SIMMS7400
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is online now Forum Staff  
Administrator
 
Join Date: Jul 2012
Last Activity: 18 November 2017, 6:16 PM EST
Location: San Jose, CA, USA
Posts: 10,651
Thanks: 571
Thanked 3,729 Times in 3,183 Posts
Hi SIMMS7400,
I will have to assume that you have everything under control and do not desire any further help from me. I have asked three times what shell you're using and have not received an answer. Therefore, I am unable to post a good suggested suited to your environment.

I suggested a simple way to calculate the calendar quarter from the month number (in post #10) and in that same post showed simple ways to calculate the month numbers for the three months in that quarter. Instead of using that code, you used other code that clearly calculates quarters incorrectly. (And, the code you showed us in the 1st update to post #13 still uses that incorrect calculation three out of four times when assigning values to _PQ.)

It is clear from your examples, that your definition of FirstQtrWeek and LastQtrWeek is a date that is not in that quarter with the possible exception of cases where the 1st day of a calendar quarter happens to be a Saturday. Your refusal to clearly define how those two values are calculated (instead of just giving ambiguous examples) makes it impossible to suggest code that might meet your requirements. Given that you say that 12/31/2016 is in Q12017 while your calculations (which are purely based on the month number) clearly compute that anything in December is in Q4; I have great difficulty correlating your stated requirements to your code.

I hope that some of my comments have been helpful. I won't bother you with more questions.
Sponsored Links
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Parsing a fixed column text file in sed wvdeijk Shell Programming and Scripting 4 06-25-2015 05:23 PM
Parsing text file jacobs.smith Shell Programming and Scripting 7 08-15-2012 07:20 PM
Parsing text file comp8765 Shell Programming and Scripting 3 03-18-2012 06:39 PM
Column wise file parsing. navojit dutta Shell Programming and Scripting 5 02-02-2009 04:21 AM
Text File Parsing Djlethal Shell Programming and Scripting 2 02-27-2008 03:31 AM



All times are GMT -4. The time now is 07:17 PM.