
У меня есть CSV-файл с несколькими столбцами, разделенными запятыми, в котором два столбца содержат разные даты (мм/дд/гггг). Я собираюсь определить разницу между этими двумя датами. Ниже приведен пример:
echo filename
001xxxc,28.2,03/04/2009,11/19/2009
00cvbfd,34.4,03/04/2009,01/06/2010
04rsdsd,34,12/01/2006,10/02/2001
456dfds,40,12/01/2006,04/23/2002
et556ss,40.8,12/01/2006,10/22/2002
Интересно, можно ли как-то использовать команду awk, чтобы получить разницу дат.
Я попробовал эту команду awk, но уверен, что это неправильный способ?
awk -F, '{print $1","$2","$3-$4}' filename
решение1
Предположим, вам нужна разница в днях, тогда, если у вас есть GNU awk ( gawk
), вы можете сделать что-то вроде
gawk -F, '
{
split($3,a,"/");
split($4,b,"/");
t1 = mktime(sprintf("%d %d %d 0 0 0 0",a[3],a[1],a[2]));
t2 = mktime(sprintf("%d %d %d 0 0 0 0",b[3],b[1],b[2]));
print (t2-t1)/86400
}
' filename
260
308
-1886
-1683
-1501
Аргумент mktime
должен быть строкой в формате "YYYY MM DD HH MM SS [DST]"
; установка необязательного DST
флага в ноль указывает на необходимость игнорировать летнее время (в противном случае наивное деление на 86400 приведет к дробным дням).
ВидетьGawk: эффективное программирование на AWK,9.1.5 Функции времени