我想使用 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
将被分割为三个字段:1
、2
和3
。
对于每一行,执行以下块:
{results[$1+0]+=$2+$3}
results
是一个关联数组。该数组的索引将是第一个字段,例如数字 1。(我们添加零以将字符串强制转换为数字。)然后添加第二个和第三个字段,并将结果添加到该特定的现有计数中字段 1 的值。(最初,数组中的所有单元格均为零。)
当所有行都处理完毕后,该END
块就会被执行。它所做的只是打印出数组的内容,并用管道字符分隔字段。 Thereif
过滤掉与输入中所有空行相对应的条目。
最后,我们按第一个字段对输出进行排序(我假设您想要这样),再次使用管道作为字段分隔符。