Удобный парсинг для чисел с суффиксами единицы?

Этот поиск на CDW имеет некоторые интересные машины меньше чем за $1 тысячу

http://www.cdw.com/shop/search/results.aspx?wclss=S1&prcn=100003&SortBy=TopSellers

9
задан 23 May 2017 в 14:33
4 ответа

На основе моего ответа в одном из вопросов Вы связались с:

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
12
ответ дан 2 December 2019 в 22:24

Можно использовать регулярные выражения жемчуга, чтобы сделать это. Например,

$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;
}

Это - простой сценарий. Можно рассмотреть это как начальную точку. Надежда это поможет!

3
ответ дан 2 December 2019 в 22:24

Лично, я просто не использовал бы флаг-h во-первых. "Человекочитаемая" версия округляет числа, которые должны будут быть округлены снова, когда Вы преобразуете назад, становясь еще менее точными. (Например, 2.7 МиБ 2 831 155,2 байтов. Что Вы делали с другим 0.8th байта??!)

Иначе можно спросить units для преобразования мебибайт/гибибайта/кибибайта в просто "B" и это обработает это, но необходимо было бы сделать что-то как (предположение, что вывод снабжается вкладками, иначе cut соответственно)

{your output} | cut -f1 '-d{tab}' | xargs -L 1 -I {} units -1t {}iB B | awk '{s+=$1}END{printf "%d\n",s}'
2
ответ дан 2 December 2019 в 22:24
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"
1
ответ дан 2 December 2019 в 22:24

Теги

Похожие вопросы