高级 AWK 操作
在这最后一步中,你将学习如何使用 awk
进行计算并创建格式化的报告。这些高级操作展示了 awk
的强大功能,它不仅仅是一个简单的文本过滤工具。
首先,让我们根据读数计算平均温度:
awk -F "\t" 'NR>1 {sum+=$2; count++} END {print "Average temperature: " sum/count}' probe_data.txt
在这个命令中:
NR>1
跳过标题行(第一行)
{sum+=$2; count++}
将每个温度值累加到总和中,并增加计数器
END {print "Average temperature: " sum/count}
在处理完所有行后计算并打印平均值
你应该会看到类似以下的输出:
Average temperature: -173.533
现在,让我们创建一个更详细的报告,其中包含原始数据和一些分析:
awk -F "\t" '
BEGIN {print "Temperature Reading Analysis\n---------------------------"}
NR==1 {print "Time\t\t\tReading\tStatus"}
NR>1 {
if ($2 < -173.6) status="WARNING";
else if ($2 > -173.5) status="NORMAL";
else status="CAUTION";
print $1 "\t" $2 "\t" status
}
END {print "---------------------------\nAnalysis complete."}
' probe_data.txt
这个复杂的命令:
- 在
BEGIN
块中打印标题信息
- 处理第一行时(
NR==1
)打印列标题
- 对于每一行数据(
NR>1
):
- 在
END
块中打印页脚信息
你应该会看到类似以下的输出:
Temperature Reading Analysis
---------------------------
Time Reading Status
2023-01-25T08:30:00Z -173.5 CAUTION
2023-01-25T08:45:00Z -173.7 WARNING
2023-01-25T09:00:00Z -173.4 NORMAL
---------------------------
Analysis complete.
让我们再创建一个示例,展示如何使用 awk
统计出现次数。我们将统计每个状态类别下的读数数量:
awk -F "\t" '
NR>1 {
if ($2 < -173.6) status="WARNING";
else if ($2 > -173.5) status="NORMAL";
else status="CAUTION";
count[status]++
}
END {
print "Status counts:";
for (status in count) print status ": " count[status]
}
' probe_data.txt
这个命令使用关联数组(count
)来跟踪每个状态类别下的读数数量,然后打印总数。
你应该会看到类似以下的输出:
Status counts:
WARNING: 1
NORMAL: 1
CAUTION: 1
这些示例展示了 awk
在数据分析任务中的强大功能。你可以使用类似的技术来处理日志文件、分析系统数据,或者处理 Linux 中的任何结构化文本数据。