![Linux 和 Bash 染色体排序文件](https://linux22.com/image/163941/Linux%20%E5%92%8C%20Bash%20%E6%9F%93%E8%89%B2%E4%BD%93%E6%8E%92%E5%BA%8F%E6%96%87%E4%BB%B6.png)
我需要以这种特定的方式将所有文件与基因组数据结合起来。这意味着它应该首先按数字排序,然后按字母顺序排序。文件的名称是:
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)
的 会按十进制整数对全局匹配产生的名称进行排序。和X
按Y
字典顺序保留在末尾。
要将它们合并到一个文件中:
cat Homo_sapiens.GRCh38.dna.chromosome.*.fa.gz(n) >Homo_sapiens.GRCh38.dna.combined.fa.gz
请注意,我选择的名称与模式不匹配,并且格式gzip
允许这种类型的串联(解压缩压缩的组合文件将为您提供所有组合文件中的组合数据)。如果您已将其压缩bgzip
然后我思考你应该还好。
还要注意,如果您有M
或Un
染色体(线粒体和未放置的支架),这些可能会在某种程度上扰乱排序,因为您通常希望它们在最后。
您还可以使用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
干杯