作者:手浪用户2602925023 | 来源:互联网 | 2022-11-26 12:09
我有一个包含几百个*.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
但我不知道如何在循环中指定它应该如何识别具有相同开头的文件.手动制作数百个文件根本没有意义.
有谁知道我怎么能这样做?
1> Poshi..:
我将假设命名背后的逻辑是物种是由下划线分隔的前三个单词.我还假设文件名中没有空格.
一种可能的策略是获取所有物种的列表,然后将所有具有该物种/前缀的文件连接成一个:
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)