如何仅导出含特定值字符串及w-*类值的最后出现实例
文本筛选需求解决方案
搞定这个文本筛选需求很简单!我针对你提出的两个规则,结合给出的示例值,整理了具体的实现方案:
1. 导出包含特定值的字符串的最后出现项
如果需要提取包含某个特定关键词的字符串里最后出现的那一条,可以用awk工具快速实现——它会遍历所有行,记录匹配到的最后一行内容。
比如,假设你要筛选包含m的字符串的最后出现项,执行下面的命令:
# 假设你的文本内容存在input.txt文件中 awk '/m/ {last_match = $0} END {print last_match}' input.txt
针对你的示例值,这条命令会输出:prepr-uat-fair-m
如果要筛选其他特定值,只需要把/m/里的m换成你要的关键词就行,比如筛选包含sed-1-4的最后一项,就改成/sed-1-4/,输出会是fair-sit-sed-1-4-w-3。
2. 对w-*格式的字符串,仅保留每个类别最后出现的实例
这里的“类别”指的是w-前缀前面的部分(比如fair-3451-、fair-4bb9-都属于不同类别),我们可以通过分组记录的方式,只保留每个类别下最后出现的w-*格式字符串。
用awk实现的命令如下:
awk -F'w-' '{ # 只处理包含w-的字符串 if (NF >= 2) { # 提取w-前面的部分作为类别标识 category = $1 # 用类别作为键,记录最后出现的该行内容(后续行覆盖前面的) last_in_category[category] = $0 } } END { # 遍历所有类别,输出每个类别的最后一项 for (cat in last_in_category) { print last_in_category[cat] } }' input.txt
针对你的示例值,执行后会输出:
- fair-3451-w-1
- fair-4bb9-w-3
- fair-sit-sed-1-4-w-3
- prepr-uat-fair-w-1
结合两个规则的场景
如果需要同时满足“包含特定值”和“w-*类别取最后项”,只需要在awk的判断里加上关键词匹配即可。比如筛选包含sed-1-4的w-*类别最后一项:
awk -F'w-' '/sed-1-4/ && NF >= 2 { category = $1 last_in_category[category] = $0 } END { for (cat in last_in_category) { print last_in_category[cat] } }' input.txt
输出结果会是:fair-sit-sed-1-4-w-3
内容的提问来源于stack exchange,提问作者Kalin Borisov
相关产品推荐
相关产品推荐

