gpt4 book ai didi

regex - 如何连接具有相同名称开头的文件?

转载 作者:行者123 更新时间:2023-12-01 09:13:00 36 4
gpt4 key购买 nike

我有一个包含几百个 *.fasta 文件的目录,例如:

Bonobo_sp._str01_ABC784267_CDE789456.fasta
Homo_sapiens_cc21_ABC897867_CDE456789.fasta
Homo_sapiens_cc21_ABC893673_CDE753672.fasta
Gorilla_gorilla_ghjk6789_ABC736522_CDE789456.fasta
Gorilla_gorilla_ghjk6789_ABC627190_CDE891345.fasta
Gorilla_gorilla_ghjk6789_ABC117190_CDE661345.fasta

等等

我想连接属于同一物种的文件,因此在本例中是 Homo_sapiens_cc21 和 Gorilla_gorilla_ghjk6789。

几乎每个物种都有不同数量的文件需要连接。

我知道我可以在 unix/linux 中使用一个简单的循环,例如:

    for f in thesamename.fasta; do
cat $f >> output.fasta
done

但我不知道如何在循环中指定它应该如何只识别具有相同开头的文件。对于数百个文件,手动制作完全没有意义。

有人知道我该怎么做吗?

最佳答案

我将假设命名背后的逻辑是,物种是前三个由下划线分隔的单词。我还将假设文件名中没有空格。

一种可能的策略是获取所有物种的列表,然后将具有该物种/前缀的所有文件连接成一个文件:

for specie in $(ls *.fasta | cut -f1-3 -d_ | sort -u)
do
cat "$specie"*.fasta > "$specie.fasta"
done

在此代码中,您列出所有 fasta 文件、剪切物种 ID 并生成唯一的物种列表。然后遍历这个列表,对于每个物种,将所有以该物种 ID 开头的文件连接到一个具有该物种名称的文件中。

使用 find 并避免 ls 可以编写更强大的解决方案,但它们更冗长且可能不太清晰:

while IFS= read -r -d '' specie
do
cat "$specie"*.fasta > "$specie.fasta"
done < <(find -maxdepth 1 -name "*.fasta" -print0 | cut -z -f2 -d/ | cut -z -f1-3 -d_ | sort -zu)

关于regex - 如何连接具有相同名称开头的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53652718/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com