我在文件 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
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