回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>所以我在同一个目录中有不同的.csv文件,第一行作为标题,第一列作为标签。假设文件1如下所示:</p>
<pre class="lang-none prettyprint-override"><code>name,value1,value2,value3,value4,......
name1,10,20,0,0,...
name2,20,30,0,0,...
name3,30,40,0,0,...
name4,40,50,0,0,...
....
</code></pre>
<p>文件2:</p>
<pre class="lang-none prettyprint-override"><code>name,value1,value2,value3,value4,......
name1,20,30,0,0,...
name2,30,40,0,0,...
name3,40,50,0,0,...
name4,50,60,0,0,...
....
</code></pre>
<p>所有.csv文件都具有相同的结构,具有相同的行数和列数</p>
<p>我想要的是这样的东西:</p>
<pre class="lang-none prettyprint-override"><code>name,value1,value2,value3,value4,......
name1,15,25,0,0,...
name2,25,35,0,0,...
name3,35,45,0,0,...
name4,45,55,0,0,...
....
</code></pre>
<p>其中,最后一个文件中的所有值列将是所有.csv文件中这些列中相应值的平均值。所以在结果文件的value1下,我应该有(10+20+…+…)/n,依此类推</p>
<p>csv文件的数量不是固定的,所以我想我需要一个循环</p>
<p>如何在Linux机器上使用python脚本实现这一点</p>
<p>我用awk做这个:</p>
<pre><code>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
}
print
}
}' *.csv
</code></pre>
<p>但我意识到,每个文件中的列名可能都不相同。如果name1只出现在前两个文件中;不在第三个文件中,然后我必须显示一条消息,说它在第三个文件中丢失,但仍然计算其他两个文件的平均值。
我想用字典和计数器就可以了,但我不知道怎么做</p>