如何用AWK过滤含指定字符串的行及其上一行?求助
解决AWK过滤指定行及其上一行的问题
需求说明
处理文本文件时,若当前行包含字符串9999-01-31,则不输出该行及其上一行,其余行正常输出。
示例输入
Test1 end1 Date1 : 2023-01-12 Date2 : 2023-07-23 Start Xhy Date1 : 2022-02-12 Date2 : 9999-01-31 Abc dfg Date1 : 2021-03-09 Date2 : 2021-06-24 Hello world Date1 : 2019-05-23 Date2 : 9999-01-31
预期输出
Test1 end1 Date1 : 2023-01-12 Date2 : 2023-07-23 Abc dfg Date1 : 2021-03-09 Date2 : 2021-06-24
原脚本问题分析
你尝试的脚本逻辑完全错误:
last = $0仅在脚本初始化时执行一次,后续行不会更新这个变量!/9999-01-31/ {next; next}表示不包含目标字符串时跳过两次,和需求逻辑完全相反{print last $0}的输出逻辑没有处理需要跳过的行,只会错误拼接内容
正确AWK实现方案
脚本代码
创建filter.awk文件,内容如下:
prev == "" { prev = $0; next } /9999-01-31/ { prev = ""; next } { print prev; prev = $0 } END { print prev }
逻辑解释
- 第一行:处理文件第一行,将当前行存入
prev变量,跳过后续操作 - 第二行:如果当前行包含
9999-01-31,清空prev(表示上一行不需要输出),跳过当前行 - 第三行:如果当前行无需过滤,先输出上一行(
prev),再将当前行存入prev - END块:处理文件最后一行,输出剩余的
prev内容
执行命令
awk -f filter.awk in.txt
执行后即可得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者albertkao9
相关产品推荐
相关产品推荐

