
2 つのデータ列があり、列 A に重複レコード数を追加し、列 B で数を計算し、数の割合を計算しようとしています。例:
494 1
494
494
494 1
500
500 1
500
501
501
501 1
501
494の場合、4つのレコードと2つのカウントがあるので、2/4 = 0.50などを計算しようとしています。
答え1
簡単な例として、これはawk
非常に複雑です。
{
if (A!=$1) { # This section has a different A-column
if (a) { # If a>0, then it is not the beginning
print A,b/a # Print result
}
A=$1; # Re-init variables
a=0;
b=0
}
++a;
b += $2 ? 1 : 0
}
実行するには、awkスクリプトfrac-calc
と数字を入力してnumber
実行します。
( cat number; echo ) | awk -E frac-calc
出力は次のとおりです。
494 0.5
500 0.333333
501 0.25
これはecho
、列Aが異なるため、最後のブロック501の結果が印刷されることを保証するために必要です。
長いリストかもしれません。
( cat number; echo ) | awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}'
編集する:コメントに記載されているように使用しEND
て使用したくない場合は:echo
{
if (A!=$1) { # This section has a different A-column
if (a) { # If a>0, then it is not the beginning
print A,b/a # Print result
}
A=$1; # Re-init variables
a=0;
b=0
}
++a;
b += $2 ? 1 : 0
}
END {
print A,b/a # Print result
}
そしてそれを呼び出す:
awk -E frac-calc number
これにより、単一の裏地が少し長くなります。
awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}END{print A,b/a}' number
答え2
最初のバージョン - 2D配列を使用します。
gawk '
BEGIN {
PROCINFO["sorted_in"] = "@ind_num_asc";
}
{
arr[$1][0]++;
arr[$1][1] += $2;
}
END {
for(i in arr) {
print i, arr[i][1] / arr[i][0];
}
}' input.txt
このPROCINFO["sorted_in"] = "@ind_num_asc";
行の説明は次のとおりです。事前定義された配列スキャン順序の使用。
gawk
この場合、出力を次のコマンドにパイプして置き換えることができますsort -n
。
gawk '
{
arr[$1][0]++;
arr[$1][1] += $2;
}
END {
for(i in arr) {
print i, arr[i][1] / arr[i][0];
}
}' input.txt | sort -n
2番目のバージョン - 配列がないより最適化されたバリアントです。
gawk '
NR == 1 {
record = $1;
}
record != $1 {
print record, tallies / cnt;
record = $1;
cnt = 0;
tallies = 0;
}
{
cnt++;
tallies += $2;
}
END {
print record, tallies / cnt;
}' input.txt
出力:
494 0.5
500 0.333333
501 0.25