我的文件夹中有一堆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
知道如何更正此代码吗? 非常感谢你
答案 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)
到目前为止发布的其他解决方案存在一些问题:
在写入文件时不关闭文件会产生“太多” 打开文件“错误,除非你使用GNU awk,
每次一行计算输出文件名 打开输入文件时读取而不是一次是低效的,
在输出的右侧使用带括号的表达式 重定向是未定义的行为,因此只能在某些awks中使用 (包括GNU awk)。
这将在所有方面有效且高效地运作:
awk '
FNR==1 { close(out); f=FILENAME; sub(/\..*/,"",f); pfx=">"f"_"; out=f".fasta" }
{ print pfx $3 ORS $5 > out }
' *coseq.table_headless.tsv