使用 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 为真。
说你的一个数据文件 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 为真。