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

mag*_*_wu 3 regex unix loops pattern-recognition bioinformatics

我有一个包含几百个*.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
Run Code Online (Sandbox Code Playgroud)

等等

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

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

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

    for f in thesamename.fasta; do
        cat $f >> output.fasta
    done
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在循环中指定它应该如何识别具有相同开头的文件.手动制作数百个文件根本没有意义.

有谁知道我怎么能这样做?

Pos*_*shi 5

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

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

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

在此代码中,列出所有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)
Run Code Online (Sandbox Code Playgroud)