You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Awk提取匹配行前一行中output1与output2对应的数值?

问题描述

现有文件file.txt内容如下:

Line with asdfgh output1 45 output2 80
Special Header
Line with output1 38 output2 99
Special Header

需求是提取第一列为Special的行的前一行中,output1和output2之后的数值(支持float类型带小数),最终输出文件内容应为:

45 80
38 99

已尝试执行以下Awk命令:

awk '($1 == "Special" ) {printf f; printf ("\n");} {f=$0}' file.txt > output.txt

但该命令仅捕获前一行的整行内容,得到的output.txt内容为:

Line with output1 45 output2 80
Line with output1 38 output2 99

需要改进命令,从捕获的变量f中提取output1和output2对应的特定数值。

解决方案

可以借助Awk的正则匹配功能,在遇到Special行时对缓存的前一行内容进行精准提取,修改后的命令如下:

awk '$1 == "Special" {
    match(f, /output1 ([0-9.]+) output2 ([0-9.]+)/, res)
    print res[1], res[2]
} {f = $0}' file.txt > output.txt

命令说明

  1. {f = $0}:持续将当前行内容保存到变量f中,作为下一行的“前一行缓存”。
  2. 当匹配到第一列为Special的行时:
    • 使用match()函数,通过正则output1 ([0-9.]+) output2 ([0-9.]+)匹配缓存的前一行f,捕获output1和output2后的数字([0-9.]+支持整数和带小数的float类型)。
    • 捕获到的数值会存入数组res,res[1]对应output1的数值,res[2]对应output2的数值,最后打印这两个值。

测试验证

运行上述命令后,output.txt的内容将符合需求:

45 80
38 99

同时也支持包含小数的场景,比如原行是Line with output1 3.14 output2 2.71,会输出3.14 2.71。

内容的提问来源于stack exchange,提问作者Tryer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:25:38