【问题标题】:AWK epoch diff with current and previous lineAWK epoch diff 与当前行和上一行
【发布时间】:2012-05-06 10:46:32
【问题描述】:

我有一个像这样的文件,叫做Sample:-

206,,,206,14.9,0,2012/04/24 00:00:05
206,,,206,14.9,0,2012/04/24 00:00:21
205,,,205,14.9,0,2012/04/24 00:00:23
205,,,205,14.9,0,2012/04/24 00:00:29
207,,,207,14.9,0,2012/04/24 00:00:34
205,,,205,14.9,0,2012/04/24 00:00:40
204,,,204,14.9,0,2012/04/24 00:00:46
202,,,202,14.9,0,2012/04/24 00:00:52
201,,,201,14.9,0,2012/04/24 00:01:00
202,,,202,14.9,0,2012/04/24 00:01:04

还有以下 AWK 命令:-

awk -F, '{ gsub("/"," ",$7); gsub(":"," ",$7); t+=(mktime($7)-mktime(p)); printf ("%s,%s,%s\n",mktime($7),mktime(p),t); p=$7 }' Sample

给出以下输出:-

1335222005,-1,1335222006
1335222021,1335222005,1335222022
1335222023,1335222021,1335222024
1335222029,1335222023,1335222030
1335222034,1335222029,1335222035
1335222040,1335222034,1335222041
1335222046,1335222040,1335222047
1335222052,1335222046,1335222053
1335222060,1335222052,1335222061
1335222064,1335222060,1335222065

对于每一行,第 7 列转换为纪元日期,并计算上一行纪元日期之间的差值并添加到t

在正在处理的第一行,因为 p 当前不是日期,mktime 返回 -1 扔掉我的数字。

我想要做的是,告诉 AWK 脚本,如果正在处理第 1 行,则假设差为 6。目前它正在从 1335222005 中减去 -1,得到 1335222006。

我想说,从 6 点开始 t,然后在第二行,计算出与上一行的 epoch 秒差,并将 t 增加该数量。

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    你只需要为第 1 行做一些特别的事情。

    awk -F, '
        {gsub(/[\/:]/," ",$7); this_time = mktime($7)}
        NR != 1 {t += this_time - prev_time; print this_time, prev_time, t}
        {prev_time = this_time}
    ' << END
    

    根据您的输入数据,这会打印出来

    1335240021 1335240005 16
    1335240023 1335240021 18
    1335240029 1335240023 24
    1335240034 1335240029 29
    1335240040 1335240034 35
    1335240046 1335240040 41
    1335240052 1335240046 47
    1335240060 1335240052 55
    1335240064 1335240060 59
    

    另外,初始化变量的一种便捷方法是使用 awk'f -v 选项

    awk -v t=6 '... same as before ...'
    

    【讨论】:

    • 已经设法使用此方法的变体完成了我想做的事情。非常感谢。
    【解决方案2】:

    awk 中,您可以在BEGIN 块中初始化一个变量,并存在两个变量来获取行号,这两个变量都对您的情况有用,FNRNR

    BEGIN { t = 6 }
    

    FNR == 1 { t = 6 }
    

    【讨论】:

      【解决方案3】:

      使用BEGIN (see here) 会有帮助吗? 这将允许将 t 变量初始化为您想要的任何内容。类似的东西

        awk -F, 'BEGIN {t=6} { gsub("/"," ",$7); gsub(":"," ",$7); t+=(mktime($7)-mktime(p)); printf ("%s,%s,%s\n",mktime($7),mktime(p),t); p=$7 }' Sample
      

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多