如何添加各种.csv文件的所有列的值,使单个标头和第一标签列保持相同?

时间:2018-12-12 23:16:56

标签: linux bash 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脚本实现此目的。 谢谢!

2 个答案:

答案 0 :(得分:0)

使用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和更高版本支持 true 多维数组。

希望这会有所帮助。

编辑

要计算平均值而不是总和,请尝试:

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

答案 1 :(得分:0)

使用Perl

             date_time     level
0  2018-11-12 00:11:54  261.0564
1  2018-11-12 00:42:03  262.8177
2  2018-11-12 01:12:13  263.9395
3  2018-11-12 01:42:23  264.9376
4  2018-11-12 02:12:32  267.2714
5  2018-11-12 02:42:42  268.3845
6  2018-11-12 03:12:52  269.3476
7  2018-11-12 03:43:02  270.1414
8  2018-11-12 04:13:12  270.9120
9  2018-11-12 04:43:22  271.6264
10 2018-11-12 05:13:32  272.4339
11 2018-11-12 05:43:42  273.3226
12 2018-11-12 06:13:51  274.1788
13 2018-11-12 06:44:01  274.9057
14 2018-11-12 07:14:10  275.6401
15 2018-11-12 07:44:20  276.3888
16 2018-11-12 08:14:29  277.1319
17 2018-11-12 08:44:40  277.8713
18 2018-11-12 09:14:49  278.6563
19 2018-11-12 09:44:59  279.5125
20 2018-11-12 10:15:09  280.5232
21 2018-11-12 10:45:19  281.6038
22 2018-11-12 11:15:29  282.5887
23 2018-11-12 11:45:39  283.5268
24 2018-11-12 12:15:49  284.4925
25 2018-11-12 12:45:59  285.5137
26 2018-11-12 13:16:09  286.5162
27 2018-11-12 13:46:19  287.5524
28 2018-11-12 14:16:28  288.5737
29 2018-11-12 14:46:38  289.6199
30 2018-11-12 15:16:48  290.6105
31 2018-11-12 15:46:58  291.5811
32 2018-11-12 16:17:07  292.5799
33 2018-11-12 16:47:17  295.1786
34 2018-11-12 17:17:29  296.1767
35 2018-11-12 17:47:39  297.1735
36 2018-11-12 18:17:49  298.1223
37 2018-11-12 18:47:59  298.9085
38 2018-11-12 19:18:10  299.9747
39 2018-11-12 19:48:19  300.8697
40 2018-11-12 20:18:29  301.7941
41 2018-11-12 20:48:38  302.7222
42 2018-11-12 21:18:48  303.6684
43 2018-11-12 21:48:58  304.6440
44 2018-11-12 22:19:07  305.6458
45 2018-11-12 22:49:17  306.6508
46 2018-11-12 23:19:26  307.7308
47 2018-11-12 23:49:36  308.7820