2017-02-05 80 views
0

如果日期早於指定列的n天,我需要幫助刪除一行。我的文件包含以下內容。從下面的文件中,我需要找出列4中當前日期不足50天的條目並刪除整行。如果日期小於當天日期的50天,則刪除整行

ABC, 2017-02-03, 123, 2012-09-08 
BDC, 2017-01-01, 456, 2015-09-05  
Test, 2017-01-05, 789, 2017-02-03 

我希望的輸出如下。

ABC, 2017-02-03, 123, 2012-09-08 
BDC, 2017-01-01, 456, 2015-09-05 

注意:我有一個現有的腳本,需要將其與現有腳本集成。

+0

您是否安裝了'gawk'?你可以檢查'哪個gawk'? – Inian

+0

which gawk returned/bin/gawk – Sunny1985

+0

'2015-09-05'的日期是'YYYY-MM_DD'還是'YYYY-DD-MM'格式?哪一個跟隨年份,月份或日期? – Inian

回答

0

您可以使用一個gawk邏輯類似下面,

gawk ' 
BEGIN {FS=OFS=",";date=strftime("%Y %m %d %H %M %S")} 
{ 
    split($4, d, "-") 
    epoch = mktime(d[1] " " d[2] " " d[3] " " "00" " " "00" " " "00") 
    if (((mktime(date) - epoch)/86400) > 50) print 
}' file 

的想法是使用GNU Awk string functions strftime() and mtkime()日期轉換。前者產生YYYY MM DD HH MM SS格式的時間戳,其中mktime用於轉換爲EPOCH時間。

一旦兩倍,即,當前時間戳(date)和epoch從文件$4被轉換爲EPOCH,不同的是通過86400劃分以獲得在天僅其差值大於50被打印的那些行的差異,並。

+0

謝謝Inian的幫助,你能告訴我如何使用這個? awk -f文件名? – Sunny1985

+0

@ Sunny1985:在命令行中運行它 – Inian

+0

對不起,我不明白。我應該提到輸出文件名代替「文件」?還從哪裏讀取變量?我應該提到「gawk」。我有這方面的基礎知識,請幫助.. – Sunny1985

2

你可以利用date命令完成這個任務,這將簡化腳本

$ awk -v t=$(date -d"-50 day" +%Y-%m-%d) '$4<t' input > output 

這將在輸出文件此內容

ABC, 2017-02-03, 123, 2012-09-08 
BDC, 2017-01-01, 456, 2015-09-05 

與文件名

更換輸入/輸出
+0

很棒的回答。但這只是GNU日期。對於POSIX版本,請使用紀元時間。 – dawg

相關問題