Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Bash 使用awk从第一行指定的列中的值计算平均值_Bash_Awk - Fatal编程技术网

Bash 使用awk从第一行指定的列中的值计算平均值

Bash 使用awk从第一行指定的列中的值计算平均值,bash,awk,Bash,Awk,我有一个巨大的文件,数百行,约4000列,结构如下 locus 1 1 1 2 2 3 3 3 exon 1 2 3 1 2 1 2 3 data1 17.07 7.11 10.58 10.21 19.34 14.69 3.32 21.07 data2 21.42 11.46 7.88 9.89 27.24 12.40 0.58 19.82 data1

我有一个巨大的文件,数百行,约4000列,结构如下

locus   1   1   1   2   2   3   3   3
exon    1   2   3   1   2   1   2   3
data1   17.07   7.11    10.58   10.21   19.34   14.69   3.32    21.07
data2   21.42   11.46   7.88    9.89    27.24   12.40   0.58    19.82
data1   mean1   mean2   mean3
data1   mean1   mean2   mean3
我需要分别计算每个数据线上的所有值的平均值,用相同的轨迹号,也就是说,第一行的相同数字,也就是

数据1:前三个值的平均值,轨迹为“1”的三列: 17.07,7.11,10.58,接下来的两个值为10.21,19.34,接下来的三个值为14.69,3.32,21.07

我想有这样的输出

locus   1   1   1   2   2   3   3   3
exon    1   2   3   1   2   1   2   3
data1   17.07   7.11    10.58   10.21   19.34   14.69   3.32    21.07
data2   21.42   11.46   7.88    9.89    27.24   12.40   0.58    19.82
data1   mean1   mean2   mean3
data1   mean1   mean2   mean3
我在考虑使用bash和awk。。。 谢谢您的建议。

如果是我,我会使用R,而不是awk:

为了方便起见,下面是整个过程,没有任何评论:

library(data.table)
x = fread('data.txt')
cnames = x$V1
x[,V1:=NULL]
x = t(x)
x = data.table(x,keep.rownames=F)
colnames(x) = cnames
x[,exon:=NULL]
x[,lapply(.SD,mean),locus]
如果是我,我会使用R,而不是awk:

为了方便起见,下面是整个过程,没有任何评论:

library(data.table)
x = fread('data.txt')
cnames = x$V1
x[,V1:=NULL]
x = t(x)
x = data.table(x,keep.rownames=F)
colnames(x) = cnames
x[,exon:=NULL]
x[,lapply(.SD,mean),locus]
替换为您的数据文件

替换为您的数据文件

您可以使用1.1.0版或更新版本,我使用的是上一个版本-1.1.1:

#!/bin/bash

lines=$(wc -l < "$1")

datamash -W transpose < "$1" |
datamash -H groupby 1 mean 3-"$lines" |
datamash transpose 
您可以使用版本1.1.0或更新版本(我上次使用的版本为-1.1.1):

#!/bin/bash

lines=$(wc -l < "$1")

datamash -W transpose < "$1" |
datamash -H groupby 1 mean 3-"$lines" |
datamash transpose 

bash用于操作文件和进程,而不是文本处理——您只需要awk就可以了。您的问题是,在给定输入的情况下,显示您想要的确切输出,以及您想要如何调用能够实现这一点的工具。还包括到目前为止您已经尝试过的内容,即使它只是pseudo-code.bash用于操作文件和进程,而不是用于文本处理-您只需要awk就可以了。您的问题是,在给定输入的情况下,显示您想要的确切输出,以及您想要如何调用能够实现这一点的工具。还包括到目前为止您已经尝试过的内容,即使它只是伪代码。感谢您的代码,但是,它仅适用于第一行数据,第二行上的值不正确。正确的值是data1 11.587 14.775 13.027 data2 13.587 18.565 10.933,但上面的代码是data1 11.5867 14.775 13.0267 data2 12.5867 16.67 11.98是的,我刚刚注意到。。似乎每行的数据和计数没有设置为零。由于代码很好,代码被相应地编辑了,但是,它只对第一行数据正确工作,第二行的值不正确。正确的值是data1 11.587 14.775 13.027 data2 13.587 18.565 10.933,但上面的代码是data1 11.5867 14.775 13.0267 data2 12.5867 16.67 11.98是的,我刚刚注意到。。似乎每行的数据和计数没有设置为零。代码被相应地编辑了++ve以获得好的答案++ve以获得好的答案。