首页 > 解决方案 > 在 awk 中操作文本文件中的列

问题描述

我有一个tab separated文本文件,想对一列进行一些数学运算并创建一个新的tab separated文本文件。

这是我的文件的一个例子:

chr1    144520803   144520804   12  chr1        144520813   58
chr1    144520840   144520841   12  chr1        144520845   36
chr1    144520840   144520841   12  chr1        144520845   36
chr1    144520848   144520849   14  chr1        144520851   32
chr1    144520848   144520849   14  chr1        144520851   32

我想更改4th列。实际上,我希望列中的divide每个元素都由4thsum4th column然后乘以 1000000 。就像预期的输出一样。

expected output

chr1    144520803   144520804   187500  chr1        144520813   58
chr1    144520840   144520841   187500  chr1        144520845   36
chr1    144520840   144520841   187500  chr1        144520845   36
chr1    144520848   144520849   218750  chr1        144520851   32
chr1    144520848   144520849   218750  chr1        144520851   32

我正在尝试awk使用以下命令来做到这一点,但它没有返回我想要的。你知道如何解决它:

awk '{print $1 "\t" $2 "\t" $3 "\t" $4/{sum+=$4}*1000000 "\t" $5 "\t" $6 "\t" $7}'  myfile.txt > new_file.txt

标签: awk

解决方案


您需要两次通过,一次计算总和,然后缩放字段

像这样的东西

$ awk -v OFS='\t' 'NR==FNR {sum+=$4; next}
                           {$4*=(1000000/sum)}1' file{,} > newfile

推荐阅读