du -h
の出力など、人間が読める形式の数量のデータがあり、それらの数値をさらに操作したいとします。 grepを介してデータをパイプ処理し、そのデータのサブセットの合計を実行するとします。これまでに見たことのない多くのシステムでこのアドホックを実行し、最小限のユーティリティしかありません。すべての標準の10 ^ nサフィックスのサフィックス変換が必要です。
パイプライン内で接尾辞付きの数値を実数に変換するgnu-linuxユーティリティが存在しますか?これを行うために作成されたbash関数、または正規表現の置き換えやいくつかのsedステップの代わりに、覚えやすいPerlがありますか?
38M /var/crazyface/courses/200909-90147
2.7M /var/crazyface/courses/200909-90157
1.1M /var/crazyface/courses/200909-90159
385M /var/crazyface/courses/200909-90161
1.3M /var/crazyface/courses/200909-90169
376M /var/crazyface/courses/200907-90171
8.0K /var/crazyface/courses/200907-90173
668K /var/crazyface/courses/200907-90175
564M /var/crazyface/courses/200907-90178
4.0K /var/crazyface/courses/200907-90179
| grep 200907 | <amazing suffix conversion> | awk '{s+=$1} END {print s}'
関連する参考文献:
あなたがリンクした質問の1つでの私の回答に基づいて:
awk '{
ex = index("KMGTPEZY", substr($1, length($1)))
val = substr($1, 0, length($1) - 1)
prod = val * 10^(ex * 3)
sum += prod
}
END {print sum}'
使用される別の方法:
sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/; s/$/ +\\/; $a0' | bc
これにはPerl正規表現を使用できます。例えば、
$value = 0;
if($line =~ /(\d+\.?\d*)(\D+)\s+/) {
$amplifier = 1024 if ($2 eq 'K');
$amplifier = 1024 * 1024 if ($2 eq 'M');
$amplifier = 1024 * 1024 * 1024 if ($2 eq 'G');
$value = $1 * $amplifier;
}
これは簡単なスクリプトです。それを出発点として考えることができます。それが役立つことを願っています!
個人的には、そもそも-hフラグは使用しません。 「人間が読める」バージョンは数値を四捨五入します。数値は、元に戻すときに再度四捨五入する必要があり、精度がさらに低下します。 (たとえば、2.7MiBは2831155.2バイトです。他の0.8バイトをどうしましたか??!)
それ以外の場合は、units
にMiB/GiB/KiBを単に「B」に変換するように依頼できます。これは処理されますが、次のような操作を行う必要があります(出力がタブ付きであると仮定すると、そうでない場合はcut
適切に)
{your output} | cut -f1 '-d{tab}' | xargs -L 1 -I {} units -1t {}iB B | awk '{s+=$1}END{printf "%d\n",s}'
VALUE=$1
for i in "g G m M k K"; do
VALUE=${VALUE//[gG]/*1024m}
VALUE=${VALUE//[mM]/*1024k}
VALUE=${VALUE//[kK]/*1024}
done
[ ${VALUE//\*/} -gt 0 ] && echo VALUE=$((VALUE)) || echo "ERROR: size invalid, pls enter correct size"