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
你之前尝试的问题解析
Awk脚本逻辑错误:
你之前的脚本误将当前行的第一个字段$1当作匹配模式,实际需求是检查整行是否匹配patterns.txt中的任意模式,逻辑完全错位。Sed命令用法错误:
sed -n '1p;$p'的作用是仅打印输入流的第一行和最后一行,和“每个模式的首次匹配”需求完全不符,因此无法得到预期结果。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

