0

我有一个 awk 问题,我似乎无法弄清楚。我试图解析来自 SAR 的数据,发现某些系统使用不同的语言环境,我得到不同的输出。长期的解决方案是将输出数据的所有系统上的语言环境更改为相同的东西,但我现在必须解析旧数据,这目前不是一个选项。这是我得到的两种数据:

24 小时输出:

21:10:01          all      8.43      0.00      1.81      2.00      0.00     87.76
21:20:01          all      7.99      0.00      1.74      0.82      0.00     89.44
21:30:01          all      8.35      0.00      1.76      0.94      0.00     88.95

12 小时输出:

09:10:01 PM         all      8.43      0.00      1.81      2.00      0.00     87.76
09:20:01 PM         all      7.99      0.00      1.74      0.82      0.00     89.44
09:30:01 PM         all      8.35      0.00      1.76      0.94      0.00     88.95

我需要一份awk声明,从早上 7 点到晚上 7 点获取所有 SAR 数据的项目。我最初有一些工作,但一旦我发现这个问题,它就会中断所有 24 小时输出。我试图让awk声明工作,但以下不起作用,我不知道如何使它工作:

awk '{ if ($2 == "AM" || $2 == "PM" && /07:00/,/07:00/) print $1" "$2; else '/07:00/,/19:00 print $1}' SAR_OUTPUT_FILE.txt

基本上,我要输出的是,如果它是 24 小时格式,则搜索 07:00-19:00 并仅返回输出的第一列(因为没有“AM/PM”列。如果它创建了“AM/PM”,我会透露 12 小时格式,并希望从 07:00-07:00 获取所有内容并返回第一列和第二列(时间 + “AM/PM”)。

有谁可以帮我离开这里吗?

4

1 回答 1

0

如果无法访问带有时间函数(strftime() 或 mktime())的 awk,您可以移动 12 小时结束时间,以便可以使用 24 小时时间测试对其进行测试。

这是一个 awk 可执行文件,它通过调整 12h 格式化时间中的小时数以适应 24h 时间格式来做到这一点。将结果放入t每行的变量中,并测试其是否在 24 小时范围内。

#!/usr/bin/awk -f

function timeShift(       a, h ) {
    if(NF==9 && split($1, a, ":")==3) {
        if(a[1]==12)        h = $2=="PM"?"12":"00"
        else if($2=="PM")   h = (a[1]+12)%24
        else                h = a[1]
        return( h ":" a[2] ":" a[3] )
    }
    return( $1 )
}

{ t = timeShift() }

t >= "07:00:00" && t <= "19:00:00"

如果您需要打印比整行更少的字段,可以在最终表达式之后添加一个操作块。

于 2015-03-16T05:07:56.983 回答