从tsv转换为fasta

时间:2017-06-14 18:53:28

标签: bash awk fasta

我的文件夹中有一堆TSV文件,对于其中一个人我希望得到一个fasta文件,其中标题后面的标题'>'是文件的名称。 我的TSV文件有5列没有标题:

因此:

inputfile:" A.coseq.table_headless.tsv" HIV1B-pol-seed 15 MAX 1959 GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC 输出文件名为" A.fasta"

> A_MAX

GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC

我想在bash中同时为所有文件运行脚本,我有这个脚本无法正常工作,因为在awk print语句中我有一个大括号:

for sample in `ls *coseq.table_headless.tsv`
do
base1=$(basename $sample "coseq.table_headless.tsv")
awk '{print ">"${base1}"_"$3"\n"$5}' ${base1}coseq.table_headless.tsv > ${base1}fasta

done

知道如何更正此代码吗? 非常感谢你

3 个答案:

答案 0 :(得分:2)

如果basename是直到第一个“。”的部分,你也可以摆脱循环。

 awk '{split(FILENAME,base,"."); 
       print ">" base[1] "_" $3 "\n" $5 > base[1]".fasta"}' *coseq.table_headless.tsv

答案 1 :(得分:0)

另一个 awk 解决方案:

awk '{ pfx=substr(FILENAME,1,index(FILENAME,".")-1); 
       printf(">%s_%s\n%s\n",pfx,$3,$5) > pfx".fasta" }' *coseq.table_headless.tsv 
  • pfx包含文件名的第一部分(直到第一个.

答案 2 :(得分:0)

到目前为止发布的其他解决方案存在一些问题:

  1. 在写入文件时不关闭文件会产生“太多” 打开文件“错误,除非你使用GNU awk,

  2. 每次一行计算输出文件名 打开输入文件时读取而不是一次是低效的,

  3. 在输出的右侧使用带括号的表达式 重定向是未定义的行为,因此只能在某些awks中使用 (包括GNU awk)。

  4. 这将在所有方面有效且高效地运作:

    awk '
        FNR==1 { close(out); f=FILENAME; sub(/\..*/,"",f); pfx=">"f"_"; out=f".fasta" }
        { print pfx $3 ORS $5 > out }
    ' *coseq.table_headless.tsv