У меня есть команда, которая выводит файлы следующих размеров в несколько строк:
32G
16K
2M
Требование чтобы преобразовать их в байты с помощью команды numfmt
и добавить все байты:
numfmt --from = iec 32G
[res: 34359738368 байтов] numfmt --from = iec 16K
[res: 16384 байта] numfmt --from = iec 2M
[res: 2097152 байта] Желаемый вывод составляет 34359738368 + 16384 + 2097152 , сумма всех размеров в байтах.
Предположим, что все входные данные хранятся в файле с именем temp.txt
. Я пробовал эту команду, но она выдает ошибки:
cat temp.txt | awk 'BEGIN {sum=0}; {sum+= system(numfmt --from=iec $0) } END {print sum;}'
Я не вижу никакой выгоды в вызове numfmt
изнутри awk - почему бы не просто pipe ваши данные с по это?
$ numfmt --from=iec <temp.txt | awk '{sum+=$0} END{print sum}'
34361851904
или (для имитации данных, переданных из команды), например
$ cat temp.txt | numfmt --from=iec | awk '{sum+=$0} END{print sum}' | numfmt --to=iec
33G
Если вы действительно хотите вызвать numfmt
line- он-лайн из awk, тогда вы можете сделать это в GNU awk (gawk), используя getline
из Coprocess
Пример.
$ cat temp.txt | gawk '
BEGIN{cmd = "numfmt --from=iec"}
{print $0 |& cmd; close(cmd,"to"); cmd |& getline; sum+=$0; close(cmd,"from")}
END{print sum}
'
34361851904
См.