3列データファイルで、「キー」の発生回数と関連する「値」の合計を印刷します。

3列データファイルで、「キー」の発生回数と関連する「値」の合計を印刷します。

Redisダンプファイルを読み取るためにシェルを使用しています。

ダンプファイルには、次の3つの主な列があります。

Text:tags:name    682651    520
Text:tags:age     78262     450
Value:cache       77272     672
Value:cache:name  76258     872
New:specific      77628     762
New:test          76628     8622

予想出力:

Key     Count     Sum
Text:*  2         970
Value:* 2         1544
New:*   2         9384

文字列(キー)で開始/中間/終了できるサブ文字列に基づいて列を確認できるので、上記の期待を得たいと思います。

ベストアンサー1

次のawkプログラムがこれを行います。

awk '{split($1,f,/:/);count[f[1]]++;sum[f[1]]+=$3}
     END{printf "Key\tCount\tSum\n"; for (k in count) {printf "%s:*\t%d\t%d\n",k,count[k],sum[k]}}' dump.txt
  • これは最初に列1のキーをコンポーネント:に分割し、それを配列に保存しますf。最初の項目(f[1])は、すべての追加処理のための関連キーと見なされます。
  • 発生回数は、countキーをf[1]配列インデックスとして使用して連想配列に格納されます。キーが見つかるたびに1ずつ増加します。
  • 列3の値の合計は類似配列に格納されますsum
  • 最後に、プログラムはヘッダー行を印刷し、配列に見つかったすべての配列インデックスを繰り返して、配列countインデックス(=キー)、発生数、および合計値を印刷します。

キーが印刷される順序は、格納されたawk配列の内部ロジックによって定義されます。 GNU Awkがある場合は、セクションの属性を設定して巡回順序を定義できますPROCINFO["sorted_in"]BEGIN例えば

BEGIN{PROCINFO["sorted_in"]="@ind_str_asc"}

awk「キー」に基づいて項目がアルファベット順に昇順で印刷されます。

おすすめ記事