使用 bash 命令添加多个 .csv 文件

使用 bash 命令添加多个 .csv 文件

我想使用 bash 迭代文件夹中所有随机生成的 CSV 文件并逐行添加它们。每个 CSV 文件有 3 行,第一行仅指示生成的文件的数量,可能从 1 到 50,不需要包含在总和中。该文件夹中可能有大约 5 或 6 个 CSV 文件,它是根据用户输入随机生成的。每个 CSV 文件的格式如下所示:

节点1.csv

1 | 998749 | 39
2 | 989758 | 84 
3 | 1002785| 43 
4 | 997485 | 98 
5 | 996584 | 86 
6 | 1038453| 14
(continues... )

节点2.csv

1 | 1098749| 49
2 | 899758 | 47 
3 | 992785 | 43 
4 | 1097458|98 
5 | 996584 |86 
6 | 998453| 14
(continues)

节点3.csv

1 | 998999 | 40
2 | 989758 | 50 
3 | 1002785| 70 
4 | 997485 | 89 
5 | 1006584| 33 
6 | 989453 | 10
(continues)

预期输出如下

1 | 3096625
2 | 2879455
3 | 2998511
4 | 3092713
5 | 2999957
6 | 3026397
(continues...)

基本上,我想总结文件夹中所有csv文件的内容,,,,csv文件的名称可能是这样的:node-1.csv,node-2.csv,node-3.csv .. 。ETC。每个 csc 文件中的内容就像我上面显示的那样...第一列是从 1-50 或更多的数字,第二列是本地余额,第三列是交易。我想逐行添加所有文件,即从 1 到 50 的数字,以了解每行的总输出

答案1

这是 AWK 的理想任务:

awk -F '|' \
    '    {results[$1+0]+=$2+$3} \
     END {for (i in results) \
              if (i != 0) \
                  print i" | "results[i]}' *.csv \
| sort --key=1 --field-separator='|' --numeric-sort

-F '|'表示行将被管道字符分割,即字符串1 | 2 | 3将被分割为三个字段:123

对于每一行,执行以下块:

{results[$1+0]+=$2+$3}

results是一个关联数组。该数组的索引将是第一个字段,例如数字 1。(我们添加零以将字符串强制转换为数字。)然后添加第二个和第三个字段,并将结果添加到该特定的现有计数中字段 1 的值。(最初,数组中的所有单元格均为零。)

当所有行都处理完毕后,该END块就会被执行。它所做的只是打印出数组的内容,并用管道字符分隔字段。 Thereif过滤掉与输入中所有空行相对应的条目。

最后,我们按第一个字段对输出进行排序(我假设您想要这样),再次使用管道作为字段分隔符。

相关内容