如何使用 Bash 的 join 和 sed 实现基于前缀匹配的多文件合并

轻枫姑娘_6422

轻枫姑娘_6422

2026-05-30

884人浏览

原创

如何使用 Bash 的 join 和 sed 实现基于前缀匹配的多文件合并

本文介绍如何通过 Bash 命令行工具(join + sed + 进程替换)高效合并两个制表符分隔文件,使第一文件的首列(如 a)与第二文件首列前缀(如 a_rna_1)自动对齐并横向拼接,无需临时文件或编程语言介入。

本文介绍如何通过 bash 命令行工具(`join` + `sed` + 进程替换)高效合并两个制表符分隔文件,使第一文件的首列(如 `a`)与第二文件首列前缀(如 `a_rna_1`)自动对齐并横向拼接,无需临时文件或编程语言介入。

在生物信息学或数据预处理场景中,常需将主样本表(如 sample_id\tval1\tval2\tval3)与对应衍生记录表(如 sample_id_rna_1\t...)按样本 ID 前缀进行关联合并。由于两文件键不完全相等(a vs a_rna_1),标准 join 无法直接使用——但借助 sed 提取前缀并构造对齐列,即可完美解决。

✅ 核心命令(一行搞定)

join <blockquote>
<p>? <strong>说明</strong>:  </p>
<ul>
<li>
<li>sed 's/^\([^_]*\)_.*/\1\t&/':匹配每行开头至第一个 _ 前的字符(即 a、b、c),将其提取为新首列,并用 \t 与原行拼接;  </li>
<li>& 表示原始整行,因此 a_rna_1 r r x → a<tab>a_rna_1 r r x;  </tab>
</li>
<li>join 默认以第一列为键合并,自动保留左文件全部字段 + 右文件非键字段,且仅输出一次键值(符合预期格式)。</li>
</ul>
</blockquote><h3>? 示例执行效果</h3><p>假设 file1.tsv 和 file2.tsv 内容如下:</p><pre class="brush:php;toolbar:false;"># file1.tsv
a   1   2   3
b   6   7   8
c   9   0   9

# file2.tsv
a_rna_1 r   r   x
a_rna_2 q   q   d
a_rna_3 c   c   c
b_rna_1 e   e   e
c_rna_1 a   a   g

运行命令后输出:

a   1   2   3   a_rna_1 r   r   x
a   1   2   3   a_rna_2 q   q   d
a   1   2   3   a_rna_3 c   c   c
b   6   7   8   b_rna_1 e   e   e
c   9   0   9   c_rna_1 a   a   g

⚠️ 注意事项

  • 必须排序:join 要求两输入按连接键严格升序排列,否则可能漏匹配;
  • 字段分隔符:本例默认为制表符(join 默认分隔符),若文件用空格或其他符号,请加 -t $'\t' 显式指定;
  • 重复键处理:若 file1.tsv 中某 key 出现多次(如两个 a 行),join 会与 file2.tsv 中所有匹配行做笛卡尔积——这正是示例所需行为;
  • 无匹配项处理:默认只输出有匹配的行;如需保留 file1 中无匹配的行,添加 -a 1 参数;
  • 编码与BOM:确保文件为 UTF-8 无 BOM,避免 sort 或 sed 解析异常。

? 替代方案简析

  • Python(Pandas):适合复杂逻辑或后续分析,但小任务略重:
    import pandas as pd
    df1 = pd.read_csv('file1.tsv', sep='\t', header=None, names=['id', 'v1', 'v2', 'v3'])
    df2 = pd.read_csv('file2.tsv', sep='\t', header=None, names=['key', 'x1', 'x2', 'x3'])
    df2['id'] = df2['key'].str.split('_').str[0]
    result = df1.merge(df2, on='id')
    result.to_csv('merged.tsv', sep='\t', index=False, header=False)
  • 纯 Bash 循环:可读性差、性能低,不推荐用于千行以上数据。

综上,join + sed 组合是轻量、高效、可复用的文本关联方案——掌握进程替换(

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

0

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

100

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

40

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习