如何用sed/awk/grep/perl提取邮箱域名并追加至同行?
解决方案:给邮箱列新增域名列
嘿,别慌!处理这种数千行的文本格式调整,用命令行工具或者简单脚本就能快速搞定,给你几个靠谱的方案,按需选择:
方案1:用awk(最推荐,轻量高效)
awk天生擅长处理字段分割的文本,你的每行分隔符是|:|,刚好可以利用这个特性:
一行命令直接搞定
awk -F'|:|' -v OFS='|:|' '{split($1, email_parts, "@"); print $1, email_parts[2], $2, $3, $4}' input.txt > output.txt
解释一下:
-F'|:|':把字段分隔符设为|:|,这样每行被拆成邮箱、名字等独立字段split($1, email_parts, "@"):把第一个字段(邮箱)按@分割成两部分,email_parts[2]就是我们需要的域名-v OFS='|:|':设置输出的字段分隔符和原文件一致,保证格式统一- 最后按「邮箱→域名→原后续字段」的顺序输出,完成新增列的操作
方案2:用sed(正则匹配替换)
如果你更熟悉sed,用正则表达式捕获域名并插入也可以:
sed -E 's/([^@]+@([^|]+))/\1|:|\2/' input.txt > output.txt
解释:
- 正则
([^@]+@([^|]+)):捕获整个邮箱部分,其中([^|]+)精准匹配从@到下一个|之间的域名内容 - 替换成
\1|:|\2:把原来的邮箱(\1)后面加上|:|和捕获到的域名(\2),实现新增列的效果
方案3:用Python脚本(适合需要异常处理的场景)
如果你的文件里可能存在格式不规范的行(比如没有@的无效邮箱),用Python可以更灵活地处理异常:
with open('input.txt', 'r', encoding='utf-8') as infile, open('output.txt', 'w', encoding='utf-8') as outfile: for line_num, line in enumerate(infile, 1): line = line.rstrip('\n') # 保留换行符之外的内容 if not line: outfile.write('\n') continue # 按分隔符拆分字段 parts = line.split('|:|') if len(parts) == 0: outfile.write(line + '\n') continue email = parts[0] # 提取域名,处理没有@的异常情况 if '@' in email: domain = email.split('@')[1] else: domain = '' print(f"警告:第{line_num}行的邮箱格式异常:{email}") # 插入域名到邮箱之后 new_parts = [parts[0], domain] + parts[1:] outfile.write('|:|'.join(new_parts) + '\n')
使用方法:
把上面的代码保存为add_domain_column.py,然后运行:
python add_domain_column.py
小提示
- 操作前一定要备份原文件,避免误操作导致数据丢失
- 可以先拿一小部分内容测试,比如取前10行验证效果:
确认结果符合预期后再处理整个文件head -10 input.txt | awk -F'|:|' -v OFS='|:|' '{split($1,a,"@");print $1,a[2],$2,$3,$4}'
内容的提问来源于stack exchange,提问作者bigbuddha
相关产品推荐
相关产品推荐

