Substituir a coluna de hora pela hora atual

0

Eu tenho dados no arquivo portals.csv como

nome do arquivo é portals.csv

ip,time,name
1.1.1.1,2018-08-15 11:05:28:268813353,1.13.0-0007
1.1.1.2,2018-08-16 11:05:32:016469121,1.13.0-0007
1.1.1.3,2018-08-16 11:06:42:316469121,1.13.0-0007
1.1.2.5,2018-08-16 11:15:52:416469121,1.13.0-0007

Precisa da saída como essa, os dados da coluna de hora devem ter a hora atual com segundos diferentes para cada linha

ip,time,name
1.1.1.1,2018-08-17 15:00:01,1.13.0-0007
1.1.1.2,2018-08-17 15:00:02,1.13.0-0007
1.1.1.3,2018-08-17 15:00:03,1.13.0-0007
1.1.2.5,2018-08-17 15:00:04,1.13.0-0007
    
por Syed Rizvi 17.08.2018 / 12:36

2 respostas

1

Aqui está uma opção usando o GNU Awk, usando NR para incrementar um carimbo de data e hora passado no comando date :

gawk -F, -v ts="$(date +%s)" '
  BEGIN{OFS = FS} 
  NR > 1 {$2 = strftime("%Y-%m-%d %H:%M:%S", ts + NR - 1)}
1' portals.csv
ip,time,name
1.1.1.1,2018-08-17 09:47:17,1.13.0-0007
1.1.1.2,2018-08-17 09:47:18,1.13.0-0007
1.1.1.3,2018-08-17 09:47:19,1.13.0-0007
1.1.2.5,2018-08-17 09:47:20,1.13.0-0007

Veja O Guia do Usuário do GNU Awk: Funções de tempo

Uma abordagem semelhante em Perl:

perl -MPOSIX -F, -lne '
  BEGIN{$ts = time()};
  $F[1] = strftime("%Y-%m-%d %H:%M:%S", localtime($ts + $. - 1)) if $. > 1; 
  print join ",", @F
' portals.csv 
    
por 17.08.2018 / 15:16
0

Lidar com os campos de data / hora nunca é uma tarefa fácil, portanto, para uma solução completa, muito mais esforço deve ser gasto. Se o seu arquivo de entrada tiver menos de 60 linhas, tente

awk -F, -vDT="$(date +"%F %T")" 'NR > 1 {sub (/:..$/, sprintf (":%02d", NR-1), DT); $2 = DT} 1' OFS=, file
ip,time,name
1.1.1.1,2018-08-17 12:47:01,1.13.0-0007
1.1.1.2,2018-08-17 12:47:02,1.13.0-0007
1.1.1.1,2018-08-17 12:47:03,1.13.0-0007
1.1.1.2,2018-08-17 12:47:04,1.13.0-0007
1.1.1.3,2018-08-17 12:47:05,1.13.0-0007
1.1.2.5,2018-08-17 12:47:06,1.13.0-0007

ou, um pouco mais curto,

awk -F, -vDT="$(date +"%F %H:%M")" 'NR > 1 {$2 = DT sprintf (":%02d", NR-1)} 1' OFS=, file

EDITAR: Para sua solicitação adicional de estender isso para até 99 linhas no arquivo de entrada, tente

awk -F, -vDT="$(date +"%F %H:")" 'NR > 1 {$2 = DT sprintf ("%02d:%02d", int((NR-1)/60), (NR-1)%60)} 1' OFS=, file
    
por 17.08.2018 / 12:49