2017-06-14 47 views
0

我在我的文件夹中有一堆TSV文件,并且对于其中一个人我希望获得一个fasta文件,其中标志'>'后面的标头是文件的名称。 我的TSV文件具有5列,而不头:从tsv转换为fasta

因此:

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

> A_MAX

GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC

我想在bash同时运行该脚本的所有文件和我有这个脚本谁ð oes不工作,因为在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 

任何想法如何更正此代码? 非常感谢

回答

2

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

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

伟大它的作品!非常感谢你 –

+0

也许等一会儿再回答一个问题,https://stackoverflow.com/help/someone-answers – karakfa

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包含文件名的第一部分(直到第一.
0

的其它解决方案公布至今有几个问题:

  1. 不关闭,因为它们可以写,除非你使用GNU awk将产生“太多 打开的文件”的错误的文件,

  2. 计算输出文件名每次线是 阅读,而不是当输入文件是使用上输出 redirectio的右侧括号表达式打开是低效的,并且

  3. 一次n是未定义的行为,所以只能在一些awk (包括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 
相关问题