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

如何用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 }

逻辑解释

  1. 第一行:处理文件第一行,将当前行存入prev变量,跳过后续操作
  2. 第二行:如果当前行包含9999-01-31,清空prev(表示上一行不需要输出),跳过当前行
  3. 第三行:如果当前行无需过滤,先输出上一行(prev),再将当前行存入prev
  4. END块:处理文件最后一行,输出剩余的prev内容

执行命令

awk -f filter.awk in.txt

执行后即可得到符合预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:35:07