新しいフィールドに複数のレコードがある各固有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));
}