我正在尝试创建一个相对丰度表,但遇到了一些问题。我成功地完成了一列,但正在努力改造整个表格。
- 这些表始终为 .tsv 格式,因此以制表符分隔。
- 第 1 行包含姓名。
- 第 2 行到第 x 行包含数据。
- 第 1 列包含行名称。
- 最后一列 (n) 包含分类法,因此不是数字。
- 第 2 至 (n-1) 列包含需要转换为相对丰度的实际数值数据(即值除以该列的总和)。
一个简单的表格如下所示。当然,分类字段通常会长很多,但我在这里缩短了它:
#OTU ID SampleA SampleB SampleC Taxonomy
cddjfhj63vhjdsmr4j4ot 17 14 0 d__Bacteria; p__Proteobacteria;
FPLS01016108.2.1307 15 20 14 d__Bacteria; p__Proteobacteria;
JX225178.1.1277 0 0 0 d__Bacteria; p__Bacteroidota;
FJ439832.1.1432 12 0 0 d__Bacteria; p__Bacteroidota;
基本上,输出应该是这样的:
#OTU ID SampleA SampleB SampleC Taxonomy
cddjfhj63vhjdsmr4j4ot 0.386363636 0.411764706 0 d__Bacteria; p__Proteobacteria;
FPLS01016108.2.1307 0.340909091 0.588235294 1 d__Bacteria; p__Proteobacteria;
JX225178.1.1277 0 0 0 d__Bacteria; p__Bacteroidota; c__Bacteroidia;
FJ439832.1.1432 0.272727273 0 0 d__Bacteria; p__Bacteroidota;
我找到了下面的代码,但它仅适用于一列,并且如果表不包含带有名称的顶行:
awk 'FNR==NR{s+=$2;next;} {printf "%s\t%s\n",$1,$2/s}' table.tsv table.tsv > table2.tsv
知道如何使用一些“简单”命令甚至使用 Python 在 Linux 中处理我的表,从而生成相对丰度表吗?
谢谢!
答案1
awk 'BEGIN{ FS=OFS="\t"; CONVFMT="%.9f" }
NR==FNR{ for(i=2; i<=4; i++) sum[i]+=$i; next }
FNR>1 { $2/=sum[2]; $3/=sum[3]; $4/=sum[4] }1' infile infile
通常,您需要传递开始/结束列:
awk -v strt=2 -v end=4 '
BEGIN { FS=OFS="\t"; CONVFMT="%.9f" }
NR==FNR{ for(i=strt; i<=end; i++) sum[i]+=$i; next }
FNR>1 { for(i=strt; i<=end; i++) $i/=sum[i] }1' infile infile
阅读更多关于卷积FMT;在这里,因为我使用的浮点后需要 9 个精度有效数字%.9f
(默认为%.6g
)。