Если у вас есть GNU awk
, то вы можете попробовать что-то вроде этого -
gawk '
NR==FNR{a[$2]=$1;next}
!($2 in a) {print $2,$1; next}
($2 in a) {
"date +%s -d " $1 | getline var1;
"date +%s -d " a[$2] | getline var2;
var3 = var2 - var1;
if (var3 > 4) print $2, $1, a[$2]
}' output.log input.log
Тест:
[jaypal:~/Temp] cat input.log
2012-01-16T09:00:00 9
2012-01-16T10:00:00 10
2012-01-16T11:00:00 11
[jaypal:~/Temp] cat output.log
2012-01-16T10:00:04 10
2012-01-16T11:00:10 11
2012-01-16T12:00:00 12
[jaypal:~/Temp] gawk '
NR==FNR{a[$2]=$1;next}
!($2 in a) {print $2,$1; next}
($2 in a) {"date +%s -d " $1 | getline var1; "date +%s -d " a[$2] | getline var2;var3=var2-var1;if (var3>4) print $2,$1,a[$2] }' output.log input.log
9 2012-01-16T09:00:00
11 2012-01-16T11:00:00 2012-01-16T11:00:10
Пояснение:
Мы начнем с сохранения первого поля в файле output.log в массиве, проиндексированном во втором поле. Мы используем next
для предотвращения запуска других операторов pattern{action}
. Использование NR==FNR
позволяет нам полностью удалить файл output.log.
!($2 in a) {print $2,$1; next}
Как только файл output.log будет завершен. Начнем с файла input.log. Мы проверяем, нет ли второго поля, присутствующего в файле input.log, в нашем массиве (т.е. в файле output.log) Если найдено, мы распечатаем его. Мы продолжаем это действие, пока не распечатаем все эти поля.
($2 in a) {"date +%s -d " $1 | getline var1; "date +%s -d " a[$2] | getline var2; var3=var2-var1; if (var3 > 4) print $2,$1,a[$2] }
Здесь мы ищем поля, которые присутствуют в обоих файлах. Когда мы находим эти поля, нам нужно включить нашу логику для вычисления разницы. Мы используем системную команду, чтобы найти дату. Теперь системная команда по умолчанию печатает в STDOUT, и мы не можем их контролировать. Таким образом, мы передаем вывод по каналу и фиксируем вывод, используя функцию awk
getline
, и сохраняем его в переменной (var1 и var2). Как только обе даты сохранены в переменной, мы делаем различие и сохраняем в var3, если оказалось, что var3> 4, мы печатаем его в формате, который вы хотите.