linux - 如何添加各种 .csv 文件的所有列的值,仅保持单个标题和第一个标签列相同?
问题描述
所以我在一个结构相同的目录中有各种 .csv 文件,第一行作为标题,第一列作为标签。说文件1如下:
name,value1,value2,value3,value4,......
name1,100,200,0,0,...
name2,101,201,0,0,...
name3,102,202,0,0,...
name4,103,203,0,0,...
....
文件2:
name,value1,value2,value3,value4,......
name1,1000,2000,0,0,...
name2,1001,2001,0,0,...
name3,1002,2002,0,0,...
name4,1003,2003,0,0,...
....
所有 .csv 文件都具有相同的结构,具有相同的行数和列数。
我想要的是看起来像这样的东西:
name,value1,value2,value3,value4,......
name1,1100,2200,0,0,...
name2,1102,2202,0,0,...
name3,1104,2204,0,0,...
name4,1103,2206,0,0,...
....
最后一个文件中的所有值列将是所有 .csv 文件的这些列中相应值的总和。所以在结果文件中的 value1 下我应该有 1000+100+...+... 等等。
.csv 文件的数量不固定,所以我想我需要一个循环。
如何在 Linux 机器上使用 bash 脚本来实现这一点。谢谢!
解决方案
使用AWK
,尝试类似:
awk '
BEGIN {FS=OFS=","}
FNR==1 {header=$0} # header line
FNR>1 {
sum[FNR,1] = $1 # name column
for (j=2; j<=NF; j++) {
sum[FNR,j] += $j
}
}
END {
print header
for (i=2; i<=FNR; i++) {
for (j=1; j<=NF; j++) {
$j = sum[i,j]
}
print
}
}' *.csv
- 它遍历行和列,将值累积到模拟的二维数组
sum
中。 - 您不必显式循环遍历 csv 文件。AWK 会自动为您完成。
- 在读取所有 csv 文件后,它会报告块中每一行和每一列的数量
END
。 - 请注意,gawk 4.0 及更新版本支持真正的多维数组。
希望这可以帮助。
编辑
为了计算平均值而不是总和,请尝试:
awk '
BEGIN {FS=OFS=","}
FNR==1 {header=$0} # header line
FNR>1 {
sum[FNR,1] = $1 # names column
for (j=2; j<=NF; j++) {
sum[FNR,j] += $j
}
}
END {
print header
files = ARGC - 1 # number of csv files
for (i=2; i<=FNR; i++) {
$1 = sum[i,1] # another treatment for the 1st column
for (j=2; j<=NF; j++) {
$j = sum[i,j] / files
# if you want to specify the number of decimal places,
# try something like:
# $j = sprintf("%.2f", sum[i,j] / files)
}
print
}
}' *.csv
推荐阅读
- excel - excel-vba为每个页面选项卡设置通行证
- javascript - 角度 5 上的动态后调用给出错误 404
- mysql - 更改所有带有前缀的表
- python - 我需要助手,一个按钮应该在具有特定行的组合框中工作 4 两种可能性,但仅适用于选项 1
- python-3.x - 函数将另一个函数作为参数并在其主体内调用它两次
- python - RDF 库和 SPARQL 问题
- sql - 从 USB DRIVE .MDF .LDF 读取数据时出错
- jquery - Bootstrap 4.0.0 的 Jquery 兼容版本是什么
- python - 如何在python中连接这样的变量
- broadleaf-commerce - ProductOptionValueImpl 的类转换错误 - Broadleaf 商业