如何用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
命令说明
{f = $0}:持续将当前行内容保存到变量f中,作为下一行的“前一行缓存”。- 当匹配到第一列为
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
相关产品推荐
相关产品推荐

