我在我的文件夹中有一堆TSV文件,对于其中的每个人,我想得到一个fasta文件,其中符号'>‘之后的标题是文件的名称。我的TSV文件有5列没有标题:
因此:
输入文件名为:"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你知道怎么改正这段代码吗?非常感谢
发布于 2017-06-15 03:39:45
如果基名是直到第一个".“的部分,你也可以摆脱循环。
awk '{split(FILENAME,base,".");
print ">" base[1] "_" $3 "\n" $5 > base[1]".fasta"}' *coseq.table_headless.tsv发布于 2017-06-15 05:13:06
另一个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包含文件名的第一部分(直到第一个.)发布于 2017-06-15 05:41:24
到目前为止发布的其他解决方案有几个问题:
除非您使用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.tsvhttps://stackoverflow.com/questions/44552564
复制相似问题