awkを使用して日数の違いを取得するには?

awkを使用して日数の違いを取得するには?

新しいフィールドに複数のレコードがある各固有ID($ 5)に対して、レコードの開始日と終了日($ 6)の差(日)を印刷する必要があります。

データは次のとおりです

7  65  2    5   32070  2010-12-14    13:25:30    
7  82  2    10  41920  2010-12-14    11:30:45   
7  65  2    5   32070  2010-03-25    10:15:45  
7  83  1    67  29446  2010-12-14    04:15:25          
7  81  1    47  32070  2011-5-11     08:14:20  
7  83  1    67  29446  2011-03-10    06:10:23  
7  82  2    10  41920  2011-02-28    06:25:30    
7  83  1    67  29446  2011-6-22     07:13:24  
7  82  2    10  41920  2011-5-14     06:15:25 

次の出力が必要です。

7  65  2    5   32070  2010-12-14    13:25:30   147    
7  82  2    10  41920  2010-12-14    11:30:45   150  
7  65  2    5   32070  2010-03-25    10:15:45   147  
7  83  1    67  29446  2010-12-14    04:15:25   189       
7  81  1    47  32070  2011-5-11     08:14:20   147  
7  83  1    67  29446  2011-03-10    06:10:23   189  
7  82  2    10  41920  2011-02-28    06:25:30   150   
7  83  1    67  29446  2011-6-22     07:13:24   189  
7  82  2    10  41920  2011-5-14     06:15:25   150    

次のコードを書きましたが、一意のIDごとに2つ以上のレコード($ 5)を考慮しません。

$ awk 'NR==FNR {  
           c = "date -d \""$6 "\" +%s"; # use system date for epoch time seconds  
           c | getline d;                 # execute command in c var,output to d   
           a[$5] = (($5 in a) ? d-a[$5] : d); # set or subtract from array  
           next                           # skip to next record  
       } {                                # for the second go:  
           # $1=$1;                       # uncomment to clean trailing space  
           print $0, int(a[$5]/86400)     # print record and time  difference  
       }' file file  

ベストアンサー1

このソリューションには次のものが必要ですGNU awk

NR == FNR {
    split($6, arr, "-");
    date = mktime(sprintf("%4d %02d %02d 00 00 00", arr[1], arr[2], arr[3]));
    if (!start[$5] || date < start[$5]) {
        start[$5] = date;
    }
    if (date > stop[$5]) {
        stop[$5] = date;
    }
    next;
}

{
    print $0 " " int((stop[$5] - start[$5]) / (3600 * 24));
}

おすすめ記事