Linux 和 Bash 染色体排序文件

Linux 和 Bash 染色体排序文件

我需要以这种特定的方式将所有文件与基因组数据结合起来。这意味着它应该首先按数字排序,然后按字母顺序排序。文件的名称是:

Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.2.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.3.fa.gz 
etc.
Homo_sapiens.GRCh38.dna.chromosome.11.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz
etc.
Homo_sapiens.GRCh38.dna.chromosome.X.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.Y.fa.gz

我需要在 bash 中尽可能简单地完成它;没有脚本等。我尝试使用sort -V和其他的,但它仍然不起作用。有任何想法吗? 8)

答案1

zsh壳里,

print -l Homo_sapiens.GRCh38.dna.chromosome.*.fa.gz(n)

会按照您想要的顺序打印文件:

$ print -l Homo_sapiens.GRCh38.dna.chromosome.*.fa.gz(n)
Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.2.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.3.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.4.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.5.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.6.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.7.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.8.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.9.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.10.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.11.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.12.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.14.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.15.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.16.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.17.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.18.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.19.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.20.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.21.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.X.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.Y.fa.gz

最后(n)的 会按十进制整数对全局匹配产生的名称进行排序。和XY字典顺序保留在末尾。

要将它们合并到一个文件中:

cat Homo_sapiens.GRCh38.dna.chromosome.*.fa.gz(n) >Homo_sapiens.GRCh38.dna.combined.fa.gz

请注意,我选择的名称与模式不匹配,并且格式gzip允许这种类型的串联(解压缩压缩的组合文件将为您提供所有组合文件中的组合数据)。如果您已将其压缩bgzip然后我思考你应该还好。

还要注意,如果您有MUn染色体(线粒体和未放置的支架),这些可能会在某种程度上扰乱排序,因为您通常希望它们在最后。

您还可以使用sort -t. -k5,5 -V(在第五个点分隔字段上执行“版本排序”)获得此排序顺序,而sort -V(不指定排序字段)将按染色体编号排序38,而不是染色体编号。


bash

printf '%s\0' Homo_sapiens.GRCh38.dna.chromosome.*.fa.gz |
sort -z -t. -k5,5 -V |
xargs -0 cat >Homo_sapiens.GRCh38.dna.combined.fa.gz

这将创建所有相关文件名的列表,并将它们通过管道传递给sort命令(我已经解释过)。排序后,xargs读取排序后的名称并调用cat它们来连接数据。输出将写入新文件,如示例所示zsh

在整个管道中,文件名被视为以 null 结尾的字符串。

答案2

尝试

ls | sort -V -d

它返回

Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.9.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.19.fa.gz
Homo_sapiens.GRCh38.dna.chromosome.X.fa.gz

我尝试尝试使用-V选项,因为它应该在末尾本机处理“X”,并且当您删除编号开始的字符之前的点时,它会起作用。我想知道为什么:)

编辑:选项未正确排序的原因-V在 GNU Coreutils 的网站上给出(首先,它仅专用于编号/索引版本。

https://www.gnu.org/software/coreutils/manual/html_node/Details-about-version-sort.html

干杯

相关内容