使用awk拆分下划线分隔多ID的列,保留前置分隔符并拆分出末尾ID列
实现方案
你已经通过split($1, b, "_")拿到了第一列按下划线拆分的数组b、以及拆分得到的总段数n,只需要对数组做截取拼接就能得到符合要求的两列:
- 前置ID列:取数组的前
n-1个元素,元素之间保留原下划线分隔拼接成字符串,完全还原目标格式 - 末尾ID列:直接取数组的第
n个元素,也就是拆分出来的最后一段内容
可直接运行的命令
兼容所有awk版本的通用写法
不依赖特定awk版本的内置函数,所有运行环境都能正常执行:
awk '{ n = split($1, b, "_"); prefix = ""; # 遍历从第一个到倒数第二个的元素,逐次拼接,保留原有下划线分隔 for (i=1; i < n; i++) { prefix = (i == 1 ? b[i] : prefix "_" b[i]); } # 替换原第一列为拆分后的两部分,按需求加固定间隔,保留原行其他内容输出 $1 = prefix " " b[n] print }' 你的大文本文件路径
GNU awk 精简写法
如果是Linux系统默认安装的gawk(GNU版本awk),可以直接用内置的数组范围拼接函数,代码更简洁:
awk '{ n = split($1, b, "_"); prefix = join(b, 1, n-1, "_"); $1 = prefix " " b[n] print }' 你的大文本文件路径
拆分效果匹配
按照给出的示例输入,输出结果完全符合预期:
- 输入
s1_asd_ucsd→ 输出s1_asd ucsd - 输入
b4_asd_id_vu→ 输出b4_asd_id vu - 输入
c10_id_js_uw→ 输出c10_id_js uw - 输入
d4_sch_vu→ 输出d4_sch vu
注意事项
- 拆分逻辑不绑定固定的ID段数,不管第一列是3段还是6段下划线连接的ID,都能正确拆分,不需要手动调整段数阈值
- 如果需要调整两列之间的间隔符,只需要修改命令中
prefix " " b[n]部分的间隔内容即可,比如改成prefix "\t" b[n]就是制表符分隔 - 命令会保留原行除第一列外的所有其他列内容,不会丢失原有数据
内容的提问来源于stack exchange,提问作者Ashi
相关产品推荐
相关产品推荐

