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

Solaris环境下用egrep/sed提取各模式在目标文件的首次匹配行

提取每个模式在目标文件中的首次匹配行(旧Solaris系统)

方法1:Shell循环+egrep+head(简单直观)

适合文件体积不大的场景,逻辑易懂,对新手友好:

while read pattern; do
    # 查找当前模式在target.txt中的第一个匹配行并输出
    egrep "$pattern" target.txt | head -1
done < patterns.txt

补充说明:

  • 如果需要整行精确匹配(即目标行完全等于模式内容),可将egrep "$pattern"改为egrep "^$pattern$"
  • 逐行读取patterns.txt的模式,对每个模式单独提取首次匹配,缺点是大文件下会重复读取target.txt,效率较低

方法2:Awk脚本(高效,适合大文件)

仅需遍历target.txt一次,效率更高,适合处理大型文件:

BEGIN {
    # 预加载所有模式到数组,标记为未处理状态
    while ((getline pat < "patterns.txt") > 0) {
        unprocessed[pat] = 1
    }
    close("patterns.txt")
}
{
    # 遍历未处理的模式,检查当前行是否匹配
    for (p in unprocessed) {
        if ($0 ~ p && unprocessed[p] == 1) {
            print $0          # 输出首次匹配行
            unprocessed[p] = 0 # 标记该模式已处理,后续不再匹配
            break             # 找到匹配后跳出循环,避免冗余检查
        }
    }
}

运行方式:
将上述内容保存为script.awk,执行:

awk -f script.awk target.txt

或直接一行执行:

awk 'BEGIN { while ((getline pat < "patterns.txt") > 0) unprocessed[pat]=1; close("patterns.txt") } { for(p in unprocessed) { if ($0 ~ p && unprocessed[p]==1) { print; unprocessed[p]=0; break } } }' target.txt

你之前尝试的问题解析

  1. Awk脚本逻辑错误:
    你之前的脚本误将当前行的第一个字段$1当作匹配模式,实际需求是检查整行是否匹配patterns.txt中的任意模式,逻辑完全错位。

  2. Sed命令用法错误:
    sed -n '1p;$p'的作用是仅打印输入流的第一行和最后一行,和“每个模式的首次匹配”需求完全不符,因此无法得到预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:01:10