假设我有 3 个数据帧(独立的 .txt 文件):
Acamar Begalb Caspri
Acamar 0.1 0.0 6.3
Begalb 0.33 8.3 0.0
Caspri 1.4 0.617 2.4
Acamar Begalb Caspri
Acamar 0.5 3.2 0.1
Begalb 0.0 2.1 0.5
Caspri 4.2 0.0 1.5
Acamar Begalb Caspri
Acamar 0.5 3.2 0.1
Begalb 0.0 2.1 0.5
Caspri 4.2 0.0 1.5
我想对 3 个数据帧的列值进行求和,以便得到:
Acamar Begalb Caspri
Acamar 1.1 6.4 6.5
Begalb 0.33 12.5 1
Caspri 9.8 0.617 5.4
像这样使用 datamash:
cat *.txt | datamash --headers groupby 1 sum 2-4
用 0 填充我的所有列并返回错误:
invalid numeric value in field 2: 'Acamar'
有谁知道如何使用 datamash 或其他东西来提供帮助?
多谢 :)
答案1
这段代码的工作原理是:
paste -d"\n" *.txt |
sed -r '1!{/^(\s+[[:alnum:]])+/d;}' |
LC_ALL=C ./datamash-1.3/datamash --headers groupby 1 sum 2-4
结果:
GroupBy() sum(Acamar) sum(Begalb) sum(Caspri)
Acamar 1.1 6.4 6.5
Begalb 0.33 12.5 1
Caspri 9.8 0.617 5.4
这里的主要问题是通过paste
、sed
line 和LC_ALL
value 来解决的。
paste
加入文件逐行(cat *.txt
将一个接一个地连接文件,在数据中插入标题行)sed
line 删除除第一次出现之外的标题行 (来源)- 我假设标题行是一系列空白字符 (
\s+
) 后跟字母数字字符 ([[:alnum:]])+
)
- 我假设标题行是一系列空白字符 (
LC_ALL
是一个管理语言环境的变量,可以防止对值中的点的任何误解
-W
如果字段用以下分隔符还需添加空格而不是选项卡。