【问题标题】:awk match between two patterns in an "if/else" statement“if/else”语句中两个模式之间的 awk 匹配
【发布时间】:2015-03-16 03:39:08
【问题描述】:

我遇到了一个似乎无法弄清楚的 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”)。

谁能帮帮我?

【问题讨论】:

  • 您的 12 小时示例似乎采用 24 小时格式。数据实际上是这样的吗?
  • @dawg - 不,经过漫长的一天,现在已经很晚了。我更新了它以反映 12 小时的实际输出。谢谢。
  • 如果数据和你说的完全一样,那么awk '$2=="PM"&&$1~/0[1-6]:|07:00/;$2=="AM"&&$1~/(0[8-9]|1[1-2]):|07:00/'应该可以工作

标签: if-statement awk output sar


【解决方案1】:

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

这是一个 awk 可执行文件,它通过调整 12 小时制时间中的小时数以适应 24 小时制时间格式。将每行的结果放入变量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"

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

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2015-09-04
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多