一連の数字をまとめる方法を見つけようとしています。
次のコードがあります。
lshw -class disk -class storage | grep size: | cut -d "(" -f2 | cut -d ")" -f1
これは私に結果を与える
2TB
2TB
2TB
2TB
2TB
2TB
私の他のコンピュータから:
500GB
1TB
1TB
これを要約する方法はありますか? GBまたはTBを予約する必要があります。
GB単位で表示できますか?それとも、結果が2つ以上の場合は結果を合計できますか?このコマンドを実行する必要があるコンピューターが複数あります。ハードドライブが5つある場合もあり、1つだけがある場合もあります。
答え1
xml
で提供されているツールまたは出力形式を使用して、json
利用可能な項目を解析する方が簡単です。
lshw -quiet -class disk -class storage -xml |
xmlstarlet sel -t -v //size -n |
paste -sd + - |
bc |
numfmt --to=si --suffix=B
フォーマット:
lshw -quiet -class disk -class storage -json |
jq '[.children[]|.size]|add' |
numfmt --to=si --suffix=B
xml
/解析ツールがなくてもjson
正確なバイト数を得ることができるので、/から人間が読める形式に変換するときに情報が失われることはありません。
その後、デフォルトの出力形式などの経験ベースの解析に戻すことができます。 GNUの使用grep
:
lshw -quiet -class disk -class storage -json |
grep -Po '"size" : \K\d+' |
paste -sd + - |
bc |
numfmt --to=si --suffix=B
--round=nearest
numfmt
丸めの代わりに最も近い数字に丸めるオプションをGNUに追加しました(8.21(2013)以降のGNU coreutils)。精度を上げるには、参照してください--format=%.3f
。
答え2
sed
+numfmt
解決策:
lshw -class disk -class storage \
| sed -n '/size:/ s/.*(\([0-9]*.*[KMGT]\)B)/\1/p' \
| numfmt --from si | paste -sd+ - | bc | numfmt --to si --suffix B
paste -sd+ - | bc
次に置き換えることもできます。awk '{ sum+=$1 }END{ print sum }'