リストから複数のアイテムの総数を計算する方法

リストから複数のアイテムの総数を計算する方法

私はbashとその構文に最初に触れたので、ハードドライブの全在庫数を取得するためにリストをソートする方法を知りたいです。

例は次のとおりです。私たちはさまざまなベンダーやモデルの多くのサーバーとハードドライブを持っています。

名前の出現ではない数字に基づいてどのように一緒に数えますか?

ST8000NC0002: 8
ST900MM0168: 1
ST900MM0168: 1
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 3
WD9001BKHG: 3
WD9001BKHG: 4
WD9001BKHG: 4

希望の出力:

ST8000NC0002: 8 
ST900MM0168: 2 
ST9300603SS: 3 
ST9300605SS: 4 
ST9500620SS: 3 
WD1003FBYX: 7 
WD1500HLFS: 4 
WD9001BKHG: 14

答え1

awkまさにこれのためです。data最初のフィールド()でインデックス付けされた配列()を埋め、2番目のフィールド()の値を$1累積します。$2配列を埋めた後、単純なforループを使用してデータを出力します。便宜上、出力はパイプで接続されていますsort

awk '{data[$1]+=$2} END { for( d in data ) { print d, data[d] } }' input | sort
ST8000NC0002: 8
ST900MM0168: 2
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 14

答え2

GNUの使用datamash:

datamash -W -g 1 sum 2 < file
  • -Wフィールド区切り文字でスペース(スペース/タブ)を使用(タブの代わりに)
  • -g 1最初のフィールドのグループ
  • sum 22番目のフィールドの合計値(グループあたり)

出力:

ST8000NC0002:   8
ST900MM0168:    2
ST9300603SS:    3
ST9300605SS:    4
ST9500620SS:    3
WD1003FBYX:     7
WD1500HLFS:     4
WD9001BKHG:     14

入力がすでに最初のフィールドに揃っているため、これはうまく機能します。ソートされていない入力の場合は、-sグループ化する前に入力をソートするオプションを追加してください。

関連情報