LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (https://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   How to pass DATE variable & search with it using AWK ? (https://www.linuxquestions.org/questions/linux-newbie-8/how-to-pass-date-variable-and-search-with-it-using-awk-4175620323/)

ssathishkumar 12-26-2017 05:54 AM

How to pass DATE variable & search with it using AWK ?
 
My file is as below
====================

cat test
ABCDE1020000009,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,
ABCDE1020000012,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171225z
ABCDE1020000011,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226Z
ABCDE1020000008,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171224Z
ABCDE1020000002,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,
ABCDE1020000001,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171223Z
ABCDE1020000004,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171216Z
ABCDE1020000007,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,
ABCDE1020000010,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,
ABCDE0000189991,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226Z

Expected output is:
====================

ABCDE1020000012,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171225z
ABCDE1020000011,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226Z
ABCDE1020000008,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171224Z
ABCDE1020000001,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171223Z
ABCDE1020000004,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171216Z
ABCDE0000189991,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226Z


I want to make the above output using exact date.


awk -F, -v DATE7="$(date +"%Y%m%d" -d "7 days ago")" -v DATE6="$(date +"%Y%m%d" -d "6 days ago")" -v DATE5="$(date +"%Y%m%d" -d "5 days ago")" -v DATE4="$(date +"%Y%m%d" -d "4 days ago")" -v DATE3="$(date +"%Y%m%d" -d "3 days ago")" -v DATE2="$(date +"%Y%m%d" -d "2 days ago")" -v DATE1="$(date +"%Y%m%d" -d "1 days ago")" -v DATE="$(date +"%Y%m%d")" '$5 ~ /"^$DATE7"/"^$DATE6"/"^$DATE5"/"^$DATE4"/"^$DATE3"/"^$DATE2"/"^$DATE1"/"^$DATE"/ {print $0}' test
awk: $5 ~ /"^$DATE7"/"^$DATE6"/"^$DATE5"/"^$DATE4"/"^$DATE3"/"^$DATE2"/"^$DATE1"/"^$DATE"/ {print $0}
awk: ^ syntax error


But its not working, how can i fix it ?

Turbocapitalist 12-26-2017 06:15 AM

It will help if you wrap your code in [code] [/code] tags so the indentation is preserved. But the double quotes are not needed and the syntax for variables is just the variable name, no dollar sign needed in front. This should be closer:

Code:

awk -F, \
    -v DATE7="$(date +"%Y%m%d" -d "7 days ago")" \
    -v DATE6="$(date +"%Y%m%d" -d "6 days ago")" \
    -v DATE5="$(date +"%Y%m%d" -d "5 days ago")" \
    -v DATE4="$(date +"%Y%m%d" -d "4 days ago")" \
    -v DATE3="$(date +"%Y%m%d" -d "3 days ago")" \
    -v DATE2="$(date +"%Y%m%d" -d "2 days ago")" \
    -v DATE1="$(date +"%Y%m%d" -d "1 days ago")" \
    -v DATE="$(date +"%Y%m%d")" \
    '$5 ~ DATE7 || $5 ~ DATE6 || $5 ~ DATE5 || $5 ~ DATE4 || $5 ~ DATE3 || $5 ~ DATE2 || $5 ~ DATE1 || $5 ~ DATE {print $0}' test

I haven't tested that though.

keefaz 12-26-2017 06:33 AM

Using grep
Code:

for i in {7..0}; do
  d="$d\|"$(date +"%Y%m%d" -d "$i days ago")
done
grep ",\(${d:2}\).$" test


ssathishkumar 12-26-2017 06:52 AM

Quote:

Originally Posted by Turbocapitalist (Post 5797899)
It will help if you wrap your code in [code] [/code] tags so the indentation is preserved. But the double quotes are not needed and the syntax for variables is just the variable name, no dollar sign needed in front. This should be closer:

Code:

awk -F, \
    -v DATE7="$(date +"%Y%m%d" -d "7 days ago")" \
    -v DATE6="$(date +"%Y%m%d" -d "6 days ago")" \
    -v DATE5="$(date +"%Y%m%d" -d "5 days ago")" \
    -v DATE4="$(date +"%Y%m%d" -d "4 days ago")" \
    -v DATE3="$(date +"%Y%m%d" -d "3 days ago")" \
    -v DATE2="$(date +"%Y%m%d" -d "2 days ago")" \
    -v DATE1="$(date +"%Y%m%d" -d "1 days ago")" \
    -v DATE="$(date +"%Y%m%d")" \
    '$5 ~ DATE7 || $5 ~ DATE6 || $5 ~ DATE5 || $5 ~ DATE4 || $5 ~ DATE3 || $5 ~ DATE2 || $5 ~ DATE1 || $5 ~ DATE {print $0}' test

I haven't tested that though.

Thanks a lot. Working perfectly.

awk -F, \
> -v DATE7="$(date +"%Y%m%d" -d "7 days ago")" \
> -v DATE6="$(date +"%Y%m%d" -d "6 days ago")" \
> -v DATE5="$(date +"%Y%m%d" -d "5 days ago")" \
> -v DATE4="$(date +"%Y%m%d" -d "4 days ago")" \
> -v DATE3="$(date +"%Y%m%d" -d "3 days ago")" \
> -v DATE2="$(date +"%Y%m%d" -d "2 days ago")" \
> -v DATE1="$(date +"%Y%m%d" -d "1 days ago")" \
> -v DATE="$(date +"%Y%m%d")" \ '$5 ~ DATE7 || $5 ~ DATE6 || $5 ~ DATE5 || $5 ~ DATE4 || $5 ~ DATE3 || $5 ~ DATE2 || $5 ~ DATE1 || $5 ~ DATE {print $0}' test

ABCDE1020000012,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,2017122583620Z
ABCDE1020000011,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226183620Z
ABCDE1020000008,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171224183620Z
ABCDE1020000001,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171223183620Z
ABCDE0000189991,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226183620Z

ssathishkumar 12-26-2017 06:54 AM

Quote:

Originally Posted by keefaz (Post 5797904)
Using grep
Code:

for i in {7..0}; do
  d="$d\|"$(date +"%Y%m%d" -d "$i days ago")
done
grep ",\(${d:2}\).$" test


Gr8, this also a good one.

for i in {7..0}; do d="$d\|"$(date +"%Y%m%d" -d "$i days ago"); done | grep ${d:2} test
ABCDE1020000012,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,2017122583620Z
ABCDE1020000011,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226183620Z
ABCDE1020000008,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171224183620Z
ABCDE1020000001,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171223183620Z
ABCDE0000189991,FALSE,SGSNYA101.mme.epc.mncXXX.mccYYY.3gppnetwork.org,mme.epc.mncXXX.mccYYY.3gppnetw ork.org,20171226183620Z

but i want to make it with awk and Turbocapitalist gave the right command. Thanks for your suggestions :)


All times are GMT -5. The time now is 04:16 PM.