用部分序列头重命名基因组FASTA文件

时间:2018-11-01 02:42:47

标签: bash filenames fasta

我想用生物体名称(存储在文件中)和标识符(文件名的一部分)重命名FASTA文件。

所有文件的文件名和存储数据的格式相同,每个文件只有一个FASTA标头和相应的顺序。

原始文件名:

$ head GCF_000008205.1_ASM820v1_genomic.fna

>NC_007295.1 Mycoplasma hyopneumoniae J, complete genome
CCAAAATCAACTTTATTAAATGTGCTAAATAAAGTTGATAAAATGTTTGCAAAAACATTTTTGTTGTTTTAAACAAAACA
AATTGATTTAAAAATTATACTACAAAATTAAAGGAAAATTTATAAAATGCAAACAAATAAAAATAATTTAAAGGTTAGAA
CACAGCAAATTAGACAACAAATTGAAAATTTATTAAATGATCGAATGTTGTATAACAACTTTTTTAGCACAATTTATGTA
...

我只想使用文件名中的程序集标识符(GCF_000008205.1)以及FASTA标头(猪肺炎支原体)的第二个和第三个单词来重命名文件名:

Mycoplasma_hyopneumoniae_GCF_000008205.1.fna

我已经尝试过了:

for fname in *.fna; do
mv -- "$fname" \
"$(awk 'NR==1{printf("%s_%s_%s\n",$2,$3,substr($1,2));exit}' "$fname")".fna
done

结果:

Mycoplasma_hyopneumoniae_NC_007295.1.fna

但是结果显示的是生物名称之前的代码,而不是原始文件名中我感兴趣的标识符。

谢谢!

1 个答案:

答案 0 :(得分:0)

以下想法可行,但前提是每个文件的格式都与示例中的格式相同。 在包含所有文件的目录中,执行以下操作:

for i in $(ls)
do
  name1=$(cat "$i" | grep \> | awk -v OFS='_' '{print $2,$3,_}')
  name2=$(basename "$i" | cut -d_ -f 1,2 | sed 's/$/.fna/g')
  mv "$i" "${name1}${name2}"
done

我建议先尝试创建一个备份文件夹,以防万一某些文件的格式不同。