
bashを使用してフォルダからランダムに生成されたすべてのCSVファイルを繰り返し、1行ずつ追加したいと思います。各CSVファイルには3行あります。最初の行は、生成されたファイルの数のみを示します(1〜50個)。合計に含める必要はありません。このフォルダには、ユーザー入力に応じてランダムに生成された約5〜6個のCSVファイルがあります。各CSVファイルの形式は次のとおりです。
node1.csv
1 | 998749 | 39
2 | 989758 | 84
3 | 1002785| 43
4 | 997485 | 98
5 | 996584 | 86
6 | 1038453| 14
(continues... )
node2.csv
1 | 1098749| 49
2 | 899758 | 47
3 | 992785 | 43
4 | 1097458|98
5 | 996584 |86
6 | 998453| 14
(continues)
node3.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.. 。など。各cscファイルの内容は上記のようになります。最初の列は1〜50以上の数字、2番目の列はローカル残高、3番目の列は取引です。すべてのファイルを1行ずつ追加したい。つまり、各行の合計出力を知るために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 '|'
行がパイプ文字に分割されることを示します。つまり、文字列が、および31 | 2 | 3
つのフィールドに分割されます。1
2
3
各行に対して次のブロックを実行します。
{results[$1+0]+=$2+$3}
results
連想配列です。この配列のインデックスは最初のフィールドになります(例:番号1)。 (文字列を数値に変換するために0を追加します。)次に、2番目と3番目のフィールドを追加し、その結果を特定の既存の数のフィールド1の値に追加します。 (最初は配列のすべてのセルが0です。)
すべての行が処理されると、END
ブロックが実行されます。それがすることは、配列の内容を印刷してフィールドをパイプ文字で区切るだけです。if
入力のすべての空白行に対応する項目をフィルタリングします。
最後に、パイプをフィールド区切り文字として再使用して、最初のフィールドに基づいて出力をソートします(必要なものとします)。