使用 awk (GNU) 命令回溯

Ber*_*Dom 3 bash awk

假设您的一个数据文件返回您所有的读数。清除所有杂乱后;你得到的总是 3 列:

-ERROR -1.57 -2.02 
-2.10 -0.57 ERROR
-4.70 ERROR -0.52 
-2.20 ERROR -0.02 
-2.20 -0.07 ERROR
Run Code Online (Sandbox Code Playgroud)

我知道ERROR这是唯一的错误消息,并且对于任何数据都是随机发生的,因此,它是唯一不是数字的值。

挑战

如何用最后一次成功的读数替换任何无效的读数?我试过了

awk -F' ' ' {if (isNumber $1){ replace with previous $1}}' < log.data
Run Code Online (Sandbox Code Playgroud)

但是您首先如何参考之前的阅读内容呢?

预期输出:

 0 -1.57 -2.02 
-2.10 -0.57 -2.02
-4.70 -0.57 -0.52 
-2.20 -0.57 -0.02 
-2.20 -0.07 -0.02
Run Code Online (Sandbox Code Playgroud)

mar*_*rkp 5

假设:

  • 所有行都有相同数量的空格分隔字段/列
  • 所有非数字值都包含文字字符串ERROR
  • 如果第一行包含非数字值,则替换值将为零 (0)

一个awk想法:

awk '
{ for (i=1;i<=NF;i++) {     # loop through fields
      if ($i ~ "ERROR")     # if problematic value found then ...
         $i=last[i]+0       # replace with the last value seen; "+0" to force undefined to be zero (and not "")
      last[i]=$i            # save current field as "last" for the next input line
  }
  print $0                  # print current line
}
' log.data
Run Code Online (Sandbox Code Playgroud)

这会生成:

0 -1.57 -2.02
-2.10 -0.57 -2.02
-4.70 -0.57 -0.52
-2.20 -0.57 -0.02
-2.20 -0.07 -0.02
Run Code Online (Sandbox Code Playgroud)

  • 虽然 `$i ~ "ERROR"` 在给定发布的示例输入的情况下将按预期运行,但它有一些特殊之处,因为 `~` 是正则表达式比较运算符,但您使用它来与字符串中的文本而不是正则表达式分隔符进行比较。它应该写成正则表达式比较(`~`)与正则表达式(`/.../`),即`$i ~ /ERROR/` 或(在这种情况下似乎更准确)字符串与字符串(`"..."`)进行比较(`==`),即`$i == "ERROR"`,而不是正则表达式和字符串结构的混合。 (2认同)