使用 awk (GNU) 命令回溯

Backtracking with the awk (GNU) command

说你的一个数据文件 returns 你所有的阅读。清除所有杂乱后;你总是得到 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

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

挑战

如何用上次成功的阅读替换任何无效的阅读?我试过了

awk -F' ' ' {if (isNumber ){ replace with previous }}' < log.data

但是你如何参考以前的阅读开始?

预期输出:

 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

假设:

  • 所有行的数量相同 space-delimted fields/columns
  • 所有 non-numeric 值都包含文字字符串 ERROR
  • 如果第一行包含 non-numeric 值,则替换值将为零 (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 [=10=]                  # print current line
}
' log.data

这会生成:

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

您可以使用这个 awk:

awk '{
   for (i=1; i<=NF; ++i) {
      if ($i+0 != $i)
         $i = prev[i]+0
      prev[i]=$i
   }
} 1' file

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
如果 $i 是 non-numeric 值,

$i+0 != $i 将 return 为真。