Bashコマンドを使用して複数の.csvファイルを追加する

Bashコマンドを使用して複数の.csvファイルを追加する

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つのフィールドに分割されます。123

各行に対して次のブロックを実行します。

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

results連想配列です。この配列のインデックスは最初のフィールドになります(例:番号1)。 (文字列を数値に変換するために0を追加します。)次に、2番目と3番目のフィールドを追加し、その結果を特定の既存の数のフィールド1の値に追加します。 (最初は配列のすべてのセルが0です。)

すべての行が処理されると、ENDブロックが実行されます。それがすることは、配列の内容を印刷してフィールドをパイプ文字で区切るだけです。if入力のすべての空白行に対応する項目をフィルタリングします。

最後に、パイプをフィールド区切り文字として再使用して、最初のフィールドに基づいて出力をソートします(必要なものとします)。

おすすめ記事