我有一个文件夹,里面的文件名是这样的:
"Code1_B1_1.1.fq.gz"
"Code1_B1_2.2.fq.gz"
"Code1_B2_1.1.fq.gz"
"Code1_B2_2.2.fq.gz"
...
"Code5_B1_1.1.fq.gz"
"Code5_B1_2.2.fq.gz"
"Code5_B2_1.1.fq.gz"
...
...
等
这些是DNA序列。我想根据代码编号和扩展名连接这些文件。因此,例如,我的文件“Code1_B1_1.1.fq.gz”和“Code1_B2_1.1.fq.gz”将合并为一个“Code1_both_1.1.fq.gz”。
使用bash(作为新手),我发现了如何列出我需要连接的文件,例如:
ls | grep -E "Code1.*.1.1.fq.gz"
但是我怎样才能将它们连接起来?我想简单地使用命令-cat并将输出保存到新文件中,但是如何检索我能够用-ls列出的文件?
...最后,我想从Python脚本中执行整个操作,根据我的两个条件(代码和扩展名)自动合并我的所有文件。:)
提前感谢您的帮助!
Chrys
答案 0 :(得分:1)
ls
输出供人类使用,而不是程序化消费;见Why you shouldn't parse the output of ls
。
而是使用glob expression形成文件名列表:
zcat Code1*1.1.fq.gz >outfile
...或...
gunzip -c Code1*1.1.fq.gz >outfile
如果由于某种原因需要引用此名称的部分内容,只要您不引用*
(或任何其他glob-expression),您就可以这样做元字符):
gunzip -c "Code1"*"1.1.fq.gz"
请注意,glob表达式与正则表达式略有不同:在正则表达式中,.
是一个特殊字符 - 因此grep -E "Code1.*.1.1.fq.gz"
也会将Code1AB1C1DfqEgz
与有效名称匹配,因为每个并且表达式中的每个.
都以这种方式处理。在globs中,.
并不特殊,*
意味着零或多任何东西(而不是最后一个零或更多)
答案 1 :(得分:0)
尝试列出所有文件,然后grep查找所需的文件并将其存储在文件中。
ls -ltra | egrep -e'Code1_B1_1.1.fq.gz | Code1_B1_2.2.fq.gz | Code1_B2_1.1.fq.gz | Code1_B2_2.2.fq.gz'>文件名
OR
ls | zip - @ m filename.zip