Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在awk中操作文本文件中的列_Awk - Fatal编程技术网

在awk中操作文本文件中的列

在awk中操作文本文件中的列,awk,Awk,我有一个制表符分隔的文本文件,我想对一列进行一些数学运算,并创建一个新的制表符分隔的文本文件 这是我的文件的一个示例: chr1 144520803 144520804 12 chr1 144520813 58 chr1 144520840 144520841 12 chr1 144520845 36 chr1 144520840 144520841 12 chr1 144520845 36 c

我有一个
制表符分隔的
文本文件,我想对一列进行一些数学运算,并创建一个新的
制表符分隔的
文本文件

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

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
我想更改
4列。事实上,我想将
第4列中的每个元素除以
第4列中所有元素的
和,然后乘以1000000。像预期的输出

预期输出

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 -v OFS='\t' 'NR==FNR {sum+=$4; next}
                           {$4*=(1000000/sum)}1' file{,} > newfile

什么是文件{,},它是写
文件的缩写。用于处理输入文件两次。