私は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 2
2番目のフィールドの合計値(グループあたり)
出力:
ST8000NC0002: 8
ST900MM0168: 2
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 14
入力がすでに最初のフィールドに揃っているため、これはうまく機能します。ソートされていない入力の場合は、-s
グループ化する前に入力をソートするオプションを追加してください。