如何用sed/awk等工具处理ID:提取前3字符整数并替换对应前缀?
处理ID列表的前缀替换与整数提取需求
问题描述
我有一个存储在文件example中的ID列表,内容如下:
3SN0P00000026941 14N0P00000026677 6SN0P00000024671 3SN0P00000018643
期望输出如下:
ENSN0P00000026941 3 ENSN0P00000026677 14 ENSN0P00000024671 6 ENSN0P00000018643 3
具体需求:
- 提取每行前3个字符中的所有整数
- 根据整数数量替换前缀:1个整数则替换为
EN,2个整数则替换为ENS - 行尾输出提取出的整数
之前尝试sed 's/^.../ENS/g'未达到预期效果,寻求awk、sed或其他工具的实现方案。
解决方案
使用awk实现
awk的逻辑处理能力更适合这类需要提取、统计与分支判断的场景:
awk '{ # 获取前3个字符作为原始前缀 orig_prefix = substr($0, 1, 3) # 提取前缀中的所有数字 nums = orig_prefix gsub(/[^0-9]/, "", nums) # 根据数字长度选择新前缀 new_prefix = length(nums) == 1 ? "EN" : "ENS" # 拼接新前缀、原行剩余内容与提取的数字并输出 print new_prefix substr($0, 4) " " nums }' example
使用sed实现
通过正则匹配分组与分支处理两种数字数量的情况:
sed -E ' # 处理前3字符含2个数字的情况(如14N) s/^([0-9]{2})([A-Z])(.*)/ENS\3 \1/; # 处理前3字符含1个数字的情况(如3SN) s/^([0-9])([A-Z]{2})(.*)/EN\3 \1/ ' example
这个写法直接通过分组捕获数字和字母部分,一步完成前缀替换与数字提取。
内容的提问来源于stack exchange,提问作者Dr. Coke
相关产品推荐
相关产品推荐

