相対的な存在比率表を作成しようとしましたが、いくつかの問題が発生しました。 1つの列が正常に完了しましたが、テーブル全体を変換するのが困難です。
- テーブルは常に.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;
次のコードが見つかりましたが、1つの列に対してのみ機能し、テーブルに名前のある一番上の行が含まれていない場合:
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
)が必要な浮動小数点を使用しているためです。