首页 > 解决方案 > 如何在linux中将文件的每一列除以单独文件中的一行?

问题描述

我有一个大的制表符分隔文件,如下所示:

all.raw.data

genes DAR20150803d0 DAR20150803d19 DAR20150803d21 DAR20150804d0 ...
WG_115-M 442 388 230 439
WG_63 415 359 260 409
MG_556  247 220 119 268
...

我还有一个读取计数文件:

readcounts.txt

14
12
13
99
...

我想将第一个数据列除以all.raw.data第一行readcounts.txt,依此类推。我的输出应该是这样的:

genes DAR20150803d0 DAR20150803d19 DAR20150803d21 DAR20150804d0
WG_115-M 31.6 32.3 17.7 4.4
WG_63 29.6 29.9 20 4.1
MG_556 17.6 18.3 9.2 2.7

我尝试过使用 awk,但我不知道如何读取readcount.txt文件的每一行,然后让带有 awk 的列加一。我认为我下面的尝试是最接近的,但仍然行不通。

COUNT=1
while read p; do
    COUNT=$(( $COUNT + 1 ))
awk -v c=$p -v d=$COUNT '{ for ((i=d+1;i>=1;i--)) $i /= c; print }' OFS='\t' all.raw.done;
done < readcounts.txt

任何帮助将不胜感激!

标签: linuxbashawk

解决方案


$ awk 'BEGIN { FS=OFS="\t"; CONVFMT="%.1f" }
    NR==FNR { a[NR]=$1; next }
    FNR>1 { for (i=2; i<=NF; i++) $i /= a[i-1] }
1' readcounts.txt all.raw.data
genes   DAR20150803d0   DAR20150803d19  DAR20150803d21  DAR20150804d0
WG_115-M        31.6    32.3    17.7    4.4
WG_63   29.6    29.9    20      4.1
MG_556  17.6    18.3    9.2     2.7

推荐阅读