Как применить команду к каждому строка в выводе из pipe и добавить все эти числа?

У меня есть команда, которая выводит файлы следующих размеров в несколько строк:

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;}'
0
задан 4 June 2020 в 20:49

1 ответ

Я не вижу никакой выгоды в вызове 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

См.

1
ответ дан 19 June 2020 в 21:34

Другие вопросы по тегам:

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