【问题标题】:Converting from tsv to fasta从 tsv 转换为 fasta
【发布时间】:2017-06-15 14:16:15
【问题描述】:

我的文件夹中有一堆 TSV 文件,对于其中的每个人,我想获得一个 fasta 文件,其中符号“>”后面的标题是文件名。 我的 TSV 文件有 5 列没有标题:

因此:

输入文件调用:“A.coseq.table_headless.tsv” HIV1B-pol-seed 15 MAX 1959 GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC 名为“A.fasta”的输出文件

>A_MAX

GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC

我想在 bash 中同时为所有文件运行脚本,但我有这个脚本不起作用,因为在 awk 打印语句中我有一个花括号:

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

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

【问题讨论】:

    标签: bash awk fasta


    【解决方案1】:

    如果基本名称是第一个“.”之前的部分,您也可以摆脱循环。

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

    【讨论】:

    【解决方案2】:

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

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

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

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

    这将在所有 awks 中稳健高效地工作:

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

    【讨论】:

      【解决方案3】:

      另一个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 包含 filename 的第一部分(直到第一个 .

      【讨论】:

        猜你喜欢
        • 2016-06-06
        • 2015-07-22
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多