Bash 使用awk从第一行指定的列中的值计算平均值
我有一个巨大的文件,数百行,约4000列,结构如下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
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以获得好的答案。