将时间列替换为当前时间

将时间列替换为当前时间

我在文件 ports.csv 中有数据,例如

文件名是门户.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

需要这样的输出,时间列数据应该采用当前时间,每行的秒数不同

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

答案1

这是使用 GNU Awk 的选项,用于NR增加从命令传入的纪元时间戳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

GNU Awk 用户指南:时间函数


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 

答案2

处理日期/时间字段从来都不是一件容易的事情,因此对于一个完整的解决方案,必须花费更多的努力。如果您的输入文件少于 60 行,请尝试

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

或者,稍微短一点,

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

编辑:对于将其扩展到输入文件中最多 99 行的额外请求,请尝试

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

相关内容