【发布时间】:2019-12-27 06:45:20
【问题描述】:
我有一些看起来像这样的文件:
418_S32_L003_R1_001.fastq.gz
418_S32_L003_R2_001.fastq.gz
418_S1_L002_R1_001.fastq.gz
418_S1_L002_R2_001.fastq.gz
419_S32_L003_R1_001.fastq.gz
419_S32_L003_R2_001.fastq.gz
419_S1_L002_R1_001.fastq.gz
419_S1_L002_R2_001.fastq.gz
每组四个文件的第一个数字不同。
如果*R1* 或*R2* 的值相同,则应将以相同编号开头的样本组合在一起。
所以,这两个样本应该连接起来:
418_S32_L003_R1_001.fastq.gz
418_S1_L002_R1_001.fastq.gz
这两个应该连接起来:
419_S32_L003_R2_001.fastq.gz
419_S1_L002_R2_001.fastq.gz
并且应该对目录中的所有文件重复此操作。
除了像这样手动连接之外,在 bash 中是否有更好的方法来做到这一点:
cat 418_S32_L003_R1_001.fastq.gz 418_S1_L002_R1_001.fastq.gz > 418_R1.fastq.gz
【问题讨论】:
-
生成有问题的文件名列表。
sort这个列表,通过将_定义为字段分隔符,由第一个和第四个字段组成。如果您的目录中没有具有奇怪名称的文件(即带有嵌入换行符的名称),这是sorted=( $(ls *.fastq.gz|sort .....) )这为您提供了一个新的有序列表,其中要连接的文件的名称彼此相邻.现在按顺序处理列表,只要“键值”(418,R1)发生变化,就会打开一个新的输出文件。查看 bash 手册页,了解如何从字符串中提取这些键值的正则表达式。