Obtenha todos os registros de um arquivo com o Data collumn menor que um mês

0

Arquivo de entrada

ID,Name,join_date
21433432,rds,2014_02_01
2131321,ABCDS,2014-10-20
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

É necessário que dois arquivos criem um para registros com a coluna de data menor que um mês e menos de 6 meses

arquivo de saída 1 com menos de um mês

ID,name,join_date
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

arquivo de saída 2 com menos de 6 meses

2131321,ABCDS,2014-10-20

usando o comando awk , mas não funcionando.

    
por user_tmo 24.01.2015 / 01:26

2 respostas

1

Isso ajudará você a começar. Requer o GNU awk para as funções de hora:

gawk -F, '
    function totime(ymd) {gsub(/[-_]/," ",ymd); return mktime(ymd " 0 0 0")}
    BEGIN {now = systime(); m1 = now - 86400 * 30; m6 = now - 86400 * 180}
    FNR == 1 {next}
    {t = totime($3)}
    t > m1 {print "m1", $0; next}
    t > m6 {print "m6", $0}
' file
m6 2131321,ABCDS,2014-10-20
m1 2432745314,ASRER, 2015-01-20
m1 2132432423,safdsad, 2015-12-30

Não são exatamente 1 e 6 meses, são 30 e 180 dias, mais ou menos uma hora para transições de horário de verão

    
por 24.01.2015 / 02:57
0

Basta brincar com o comando date dentro de awk e redirecionar a saída de print para os arquivos desejados de acordo com certas condições:

awk -F, 'BEGIN{ "date -d\"month ago\" +%s" | getline T1; close("date"); 
  "date -d\"6 months ago\" +%s" | getline T6; close("date")}
  { "date -d" $3 " +%s" | getline t; close("date"); 
  if(t>T1){print $0>"file2";next} if(t>T6)print $0>"file3"}' file

A parte crucial é um formato de transformação de data para número de segundos desde 1970 com o comando date -d ... "+%s" . O resto deve ser auto-explicativo.

    
por 24.01.2015 / 02:14

Tags