perl -F'[|]' -lane '
($m2, $d2, $y2, $m1, $d1, $y1) = map { split /-/ } @F[14,13];
($m2, $d2, $y2, $m1, $d1, $y1) =
($m1, $d1, $y1, $m2, $d2, $y2) if !($y2 > $y1 or $m2 > $m1 or $d2 > $d1);
print if
2 == grep /^10-\d{2}-\d{4}$/, @F[13,60]
and
(((12*($y2-$y1)+$m2-$m1) == 1 && ($d2 < $d1))
||
((12*($y2-$y1)+$m2-$m1) == 0))
' yourfile
Explicação
Nós configuramos um loop de leitura de linha implícito e dividimos cada linha com o pipe '|' delimitador e a arrray @F
cujo índice iniciado em 0
é construído.
Em seguida, adicionamos as informações de mês / ano / dia dos campos 14
e 15
nas variáveis escalares para facilitar as manipulações mais adiante no código.
E enquanto estamos nisso, fazemos um ligeiro ajuste para garantir que m2y2d2
date seja sempre mais recente que o m1y1d1
apenas para simplificar nossos cálculos de lógica de data.
Finalmente, decidimos imprimir o registro atual, também conhecido como linha, a julgar por esses quatro critérios, a saber,
- O 14º elemento, ou seja,
$F[13]
é uma data deOctober
mês. AND - O elemento 61-st, por exemplo,
$F[60]
, também é uma data% mêsOctober
. AND - As duas datas são separadas por um mês, o ano foi considerado
ao usar o termo
(y2-y1)*12
, eles ficam a um mês um do outro quando o dia da data mais alta é < menor dia da data. OU - As duas datas são do mesmo ano, mesmo mês = > eles estão dentro de um mês de qualquer maneira.