awk groupの実行中に列値を保存する

awk groupの実行中に列値を保存する

次のデータを含む入力ファイルがあります。

1484523745 96000 2856 25059 0  
1484523745 96000 2856 25150 0  
1484523745 4864960 2856 997962 193  
1484523745 96000 2856 24923 1  
1484523745 280000 2856 61454 12  
1484523746 1179968 2856 309430 1  
1484523746 4864960 2856 1115576 300  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 997962 116  
1484523746 96000 2856 25059 0  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 1146028 211  
1484523746 4864960 2856 1115576 371  
1484523746 3184960 2856 875340 1  

要件は、列2と3の固有の組み合わせに基づいて列4と5の集計を見つけ、各固有の組み合わせの数を見つけ、列1(エポック時間)で各固有の組み合わせが最初に表示されるものを使用することです。この結果の組み合わせ。したがって、出力は次のようになります。

96000 2856 150309 1 6 1484523745  
3184960 2856 875340 1 1 1484523746  
1179968 2856 309430 1 1 1484523746  
280000 2856 61454 12 1 1484523745  
4864960 2856 5373104 1191 5 1484523745  

私のMac PCでは、datamashを使用して1行のコマンドでこれを簡単に実行できます。

datamash -W --sort -g 2,3 sum 4,5 count 5 first 1 < inputfile

ただし、入力ファイルが配置されているLinuxプロダクションサーバーにはデータマッシュがないため、インストールアクセスが制限されます。 (何千もの入力ファイルがあるため、そのファイルをMacにFTPに送信できませんでした。)ので、awkコマンドを使用して同じ結果を得ようとしました。独自の組み合わせが最初に表示された場合は、列1の値を印刷することを除いて、目的の結果が得られました。

awk -F " " '{a[$2" "$3]+=$4; b[$2" "$3]+=$5; c[$2" "$3]++} END{for(i in a)print i, a[i], b[i], c[i]}' inputfile

を使用してawk列2と3の各固有の組み合わせが最初に発生した場合、列1の値をどのように保存しますか?

答え1

配列にキーがあるかどうかをテストし、キーがない場合にのみ更新できます。

{
    if (! ($2" "$3 in x))
        x[$2" "$3] = $1;
    a[$2" "$3]+=$4;
    b[$2" "$3]+=$5;
    c[$2" "$3]++
}
END {
    for (i in a)
        print i, a[i], b[i], c[i], x[i]
}

関連情報