2016-09-27 3 views
-1

У меня есть сценарий, который, когда я, наконец, труба,Использование AWK заменить строку с помощью умножения

awk -F'[()]' '{ 
printf("%s %s\n", $2, $4) 
}' 

возвращает

251.393GB 103.005GB 
245.296GB 101.992GB 
250.526GB 103.639GB 
259.158GB 112.549GB 
245.266GB 102.415GB 
325.020GB 129.041GB 
245.135GB 102.086GB 
250.583GB 103.758GB 
244.247GB 103.268GB 
251.256GB 104.008GB 
244.496GB 102.643GB 
265.133GB 113.523GB 
250.332GB 103.556GB 
319.579GB 127.401GB 
250.140GB 103.722GB 
244.765GB 102.541GB 

Однако, я хотел бы преобразовать GB (который я нашел действует как 1024^3) до MB (что я хотел бы выразить как 1000^2).

Использование awk, как я могу обнаружить устройство (GB, MB и т. Д.) И преобразовать его в соответствующий блок, используя 1000 вместо 1024? В сущности, я хотел бы просто относиться к GB, как *(1024*1024*1024)/(1000*1000)

+1

Если вы хотите скрипт для обнаружения МБ, почему бы вам не включить MB в ваш образец ввода? Также включите ожидаемый результат, учитывая ваш введенный образец ввода (который должен быть сокращен до нескольких строк). –

ответ

0

первый, предвычислять множитель:

awk 'BEGIN{print (1024*1024*1024)/(1000*1000)}' 
1073.74 

затем найти поля с «GB», умножать их, и добавить «МБ».

awk '{ 
    if($1~"GB") $1=1073.74*$1"MB" 
    if($2~"GB") $2=1073.74*$2"MB" 
    print $1, $2 
}' 

(как GNU awk и awk ручка математике на струнах лишь с учетом количества символов, например, "123.45GB" * 10 дает 1234.5)

+1

хорошо пункт! исправлено. – webb

0

Как насчет

echo "319.579GB 127.401GB" \ 
| awk '{sub(/GB$/,"",$1);sub(/GB$/,"",$2);printf("%.3f\t%.3f\n", $1*(1024*1024*1024)/(1000*1000) , $2*(1024*1024*1024)/(1000*1000))}' 

выход

43145.338  136795.782 

То же самое для файла

awk '{sub(/GB$/,"",$1);sub(/GB$/,"",$2) 
    printf("%.3f\t%.3f\n", $1*(1024*1024*1024)/(1000*1000) , $2*(1024*1024*1024)/(1000*1000))}' file 

Вы можете настроить десятичную точность, но изменяя значение .3, или оставить его altogehter, если вы просто хотите, целочисленное значение.

sub(...) работы путем сопоставления GB в конце строки $, и заменяет пустую строку ("") для указанного столбца (т.е. $1 или $2). sub примет любое строковое значение в 3-м поле, так что «strGB», arr[1], arr [key] `и другие будут работать.

IHTH

+0

В этом выпуске отсутствует 300000 МБ. –

+0

OP также хочет обнаруживать единицы; этот ответ предполагает, что это всегда ГБ. – webb

+0

Я предполагаю, что ОП - большой мальчик и может экстраполировать из этого решения, что делать для MB, PB, KB и т. Д. ;-) Всем удачи. – shellter

0

Решение с использованием perl где e флаг удобен в таких случаях

$ cat ip.txt 
251.393GB 103.005GB 
245.296GB 101.992GB 
250.526GB 103.639GB 

Без ограничения десятичной точности

$ perl -pe 's|([0-9.]+)GB|$1*(1024*1024*1024)/(1000*1000)|ge' ip.txt 
269931.178360832 110600.77658112 
263384.574459904 109513.076113408 
269000.244199424 111281.528897536 

С точностью

$ perl -pe 's|([0-9.]+)GB|sprintf "%.3f",$1*(1024*1024*1024)/(1000*1000)|ge' ip.txt 
269931.178 110600.777 
263384.574 109513.076 
269000.244 111281.529 

Предварительное вычисление коэффициента

$ perl -pe 'BEGIN{$m=(1024*1024*1024)/(1000*1000)} s|([0-9.]+)GB|sprintf "%.3f",$1*$m|ge' ip.txt 
269931.178 110600.777 
263384.574 109513.076 
269000.244 111281.529 

Для печати MB на выходе, а также, использовать %.3fMB

2
$ cat file 
251.393GB 103.005GB 
245.296GB 101.992GB 
250.526GB 103.639GB 

$ awk '{for (i=1;i<=NF;i++) printf "%sMB%s", $i * ($i~/GB/ ? 1073.4 : 1), (i<NF ? OFS : ORS)}' file 
269845MB 110566MB 
263301MB 109478MB 
268915MB 111246MB 

или, если вы предпочитаете:

$ awk '{for (i=1;i<=NF;i++) printf "%.3fMB%s", $i * ($i~/GB/ ? 1073.4 : 1), (i<NF ? OFS : ORS)}' file 
269845.246MB 110565.567MB 
263300.726MB 109478.213MB 
268914.608MB 111246.103MB 
Смежные вопросы