我怎样才能用文件名中的匹配字符串来分类两个文件?

how can I cat two files with a matching string in the filename?

所以我有一个包含 ~162K 文件的目录。其中一半文件的文件名为“uniquenumber.fasta”,另一半文件的文件名为“uniquenumber.fasta letters”。例如:

12345.fasta
12345.fasta Somebacterialtaxaname
67890.fasta
67890.fasta Someotherbacterialtaxaname
...for another many thousand "pairs"

我想将共享唯一 fasta 编号的两个文件放在一起。串联的顺序无关紧要(即哪些内容在新创建的组合文件中首先出现)。我已经在命令行中尝试了一些 grep 的再现和一些糟糕的 python 脚本,但我觉得这比我正在做的更像是一个微不足道的问题。建议?

可能有很多方法可以实现这一点,但第一个想到的是使用 unix 命令 find

http://en.wikipedia.org/wiki/Find#Execute_an_action

find 命令将按照您指定的模式打印文件名。使用 -name-exec 标志,您可以指定文件名中应包含哪些字符,或 运行 附加命令来过滤输出。

如果我要解决这个问题,我可能会遍历目录中的所有文件,并且 运行 一个 -name 模式或 -exec 模式 "find" 匹配文件。然后 | 两个文件名到 cat 并将该输出重定向到一个新文件,希望将两者连接起来。希望对您有所帮助!

这是 Python 中的一个解决方案(它将在 Python 2 和 3 中保持不变)。这假设每个文件 XXXXX.fasta 有一个且只有一个匹配的 XXXXX.fasta stringofstuff 文件。

import glob

fastafiles = sorted(glob.glob("*.fasta"))

for fastafile in fastafiles:
    number = fastafile.split(".")[0]
    space_file = glob.glob(number + ".fasta *")
    with open(fastafile, "a+") as fasta:
        with open(space_file[0], "r") as fasta_space:
            fasta.write("\n")
            fasta.writelines(fasta_space.readlines())

它是这样工作的:首先,所有 *.fasta 文件的名称被放入一个列表中(我对列表进行了排序,但这并不是绝对必要的)。接下来,文件名在 . 处被拆分,并存储第一部分(文件名中的数字)。然后,我们搜索匹配的 XXXXX.fasta something 文件,假设只有其中一个,我们以追加模式打开 .fasta 文件,以读取模式打开 .fasta something 文件。我们在 .fasta 文件的末尾写一个换行符,然后读入 "space file" 的内容并将它们写入 .fasta 文件的末尾。由于我们使用 with 上下文管理器,因此我们不需要在完成后专门关闭文件。