1 行の AWK コマンドでは不十分なデータを操作する方法についての提案を探しています。最大 1000 以上の行と列のデータ セットを扱っています。定義する列変数が多すぎるという問題が発生しています。ループを使用して配列を反復処理し、カウントして合計する列を定義する方法があると考えています。Excel の COUNTIF & SUMIF と同様のキー値に基づいて、行の数と合計を計算しようとしています。
Data Set Example:
Store_Location;Person;Adult_Child;Age;Weight...
LocationA;PersonA;0;50;200
LocationB;PersonB;1;10;100
LocationA;PersonC;1;12;90
LocationA;PersonA;0;50;200
Desired Output: (delimiter is not important)
Store_Location;Count_Of_Adults;Count_of_Children;Sum_of_Age;Sum_of_Weight
LocationA;2;1;112;490
LocationB;0;1;10;100
これは、私が使用していた AWK スクリプトの例です。
BEGIN {FS=";"} {print "Store_Location;Count_Of_Adults;Count_of_Children;Sum_of_Age;Sum_of_Weight"}
{
n[$1]++;
C1_[$1] += ($3 == "1" ? 0 : 1);S1_[$1] += $4;column_sum3+=$4
C2_[$1] += ($3 == "0" ? 0 : 1);S2_[$1] += $5;column_sum4+=$5
}
END {
for (i in n) {
print i,C1_[i],C2_[i],S1_[i],S2_[i]
}
}
a2p を使用して構文を perl に変換し、(異なる列の使用に基づいて) いくつかの変更を加えました。
$base = 20;
while (<>){
@array = split(/$FS/, $_, -1);
$n{$array[$base]}++;
$C1_{$array[$base]} += ($array[21] eq '' ? 0 : 1);
$C2_{$array[$base]} += ($array[34] eq '' ? 0 : 1);
$column_count1 += ($array[21] eq '' ? 0 : 1);
$column_count2 += ($array[34] eq '' ? 0 : 1);
$S1_{$array[$base]} += $array[21];
$S2_{$array[$base]} += $array[34];
$column_sum1 += $array[21];
$column_sum2 += $array[34];
}
@sorted_keys = sort { $a <=> $b} keys %n;
foreach $i (@sorted_keys){
print $i,$C1_{$i},$C2_{$i},$S1_{$i},$S2_{$i};
これと似たようなことができるようにしたいのですが、合計したい列と数えたい列を別の配列に入れようとしていました。例: @sum_array=[1,6,10,15,30] & @count_array = [1,10,20]。また、各出力列を宣言することなく、ループを使用して合計とカウントを作成します。すべての列を合計してカウントし、必要な列を出力するだけで問題ありません。ハッシュ/配列を使用して Perl でこれをコーディングしようとすると、困難に遭遇しました。ハッシュを使用しようとしましたが、出力形式を取得できませんでした。そのため、これがデータの構造化方法であるかどうかわかりません。
$n{$array[$base]}{Adult}{count}+= ($array[21] eq 0 ? 0 : 1);
$n{$array[$base]}{Child}{count}+= ($array[21] eq 1 ? 0 : 1);
$n{$array[$base]}{Weight}{sum} += $array[21];
$n{$array[$base]}{Age}{sum}+= $array[34];
編集:私の論理的な問題は、フィールド名/列を呼び出したくないということだと思います。多くのフィールドで合計とカウントを実行したいからです。大人と子供の比較は単なる例です。操作したい列を 1 か所にリストしたいだけです。おそらく、それを説明する簡単な方法は、入力データから 100 列があるとしましょう。分析したいカラムを柔軟に特定できるようにしたい。例: 列 15-30 列 1 の一意の値に基づいて各列の合計とカウントを取得したい。次に、同じコードを変更して、列 15-20 と 30-40 の合計を取得できるようにします。AWK を使用すると、操作したい列 ($2、$3、$4、...) を呼び出すことができますが、列が多すぎると管理が難しくなります。