[英]using awk match 1 column to another in two files and then do date subtraction for the matching records
Using awk
match 1 column to another in two files and then do date subtraction(in days) for the matching records. 使用
awk
将1列与两个文件中的另一列相匹配,然后对匹配记录进行日期减法(以天为单位)。
Lets suppose i have two files 假设我有两个文件
file1: 文件1:
123,2-jul-2016
124,2-jul-2018
file2: 文件2:
123,2-jul-2015
124,2-jul-2017
If matched then give me output as 如果匹配则给我输出为
123,366
124,366
Thanks for the help 谢谢您的帮助
Could you please try following. 您可以尝试以下吗?
awk '
BEGIN{
FS=OFS=","
num=split("jan,feb,mar,apr,may,jun,jul,aug,oct,nov,dec",month,",")
for(i=1;i<=num;i++){
daymonth[month[i]]=i}
}
FNR==NR{
a[$1]=$2
next
}
($1 in a){
split($2,array2,"-")
split(a[$1],array1,"-")
print $1,(mktime(sprintf("%d %d %d 0 0 0 0",array2[3],daymonth[array2[2]],array2[1]))-\
mktime(sprintf("%d %d %d 0 0 0 0",array1[3],daymonth[array1[2]],array1[1])))\
/86400
}' Input_file2 Input_file1
With GNU awk for time functions: 使用GNU awk的时间功能:
$ cat tst.awk
BEGIN {
FS = "[,-]"
OFS = ","
}
{
mthNr = (index("janfebmaraprmayjunjulaugsepoctnovdec",$3)+2)/3
date = sprintf("%04d %02d %02d 00 00 00", $4, mthNr, $2)
secs = mktime(date)
}
NR==FNR {
end[$1] = secs
next
}
{
print $1, int((end[$1] - secs) / (24*60*60))
}
$ awk -f tst.awk file1 file2
123,366
124,365
The expected output in your question was wrong as it didn't account for the leap day in feb 2016 or for 2015 it's assuming that, for example, the difference between 3 and 4 is 2 instead of 1. 您的问题的预期输出是错误的,因为它没有说明2016年2月或2015年的leap日,例如,假设3与4之间的差是2而不是1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.