awk:创建具有增加值的列

时间:2015-09-23 12:20:23

标签: awk

我有一个包含3列的文本文件,如此

2010-01-03 11:00:00 -134        
2010-01-03 11:01:00 -131        
2010-01-03 11:02:00 -128    
...

现在我需要几秒钟的时间步,而不是现有的时间步。

如何在$ 2和$ 3之间创建一个新的列,填充增加值(0,60,120,...)直到文件末尾?

4 个答案:

答案 0 :(得分:1)

根据您的陈述和数据,您可能需要:

awk  '{ print $1, $2, i*60, $3; i++;}' orifile

答案 1 :(得分:1)

与luoluo的答案有关,版本略短:awk '{ print $1, $2, (NR-1)*60, $3}' orifile

答案 2 :(得分:1)

假设时间戳不是均匀分布的,并且您必须解析它们:使用 GNU awk ,您可以使用mktime来执行此操作:

gawk '{ ts = $1 " " $2; gsub(/[-:]/, " ", ts); t = mktime(ts) } NR == 1 { start = t } { $2 = $2 OFS (t - start); } 1'

其工作原理如下:

{                           # for all lines:
  ts = $1 " " $2            # concat first and second fields,
  gsub(/[-:]/, " ", ts)     # replace - and : with spaces. The result is the
                            # format mktime expects: "YYYY MM DD HH MM SS"
  t = mktime(ts)            # convert to seconds since Epoch
}
NR == 1 {                   # in the first line:
  start = t                 # set the starting point
}
{                           # for all lines:
  $2 = $2 OFS (t - start)   # append the seconds since start to the second field,
                            # effectively inserting a third
}
1                           # then print.

答案 3 :(得分:0)

另一种解决方案,即在awk

中插入列
awk '$3=(NR-1)*60 FS $3' file

你明白了,

2010-01-03 11:00:00 0 -134
2010-01-03 11:01:00 60 -131
2010-01-03 11:02:00 120 -128