我有一个命令,可以在多行中输出以下文件大小:
32G
16K
2M
要求是使用命令将它们转换为字节,numfmt
并将所有字节相加:
numfmt --from=iec 32G
[分辨率:34359738368 字节]numfmt --from=iec 16K
[分辨率:16384 字节]numfmt --from=iec 2M
[分辨率:2097152 字节]
期望的输出是34359738368 + 16384 + 2097152,所有大小的总和(以字节为单位)。
假设所有输入都存储在名为的文件中temp.txt
。我尝试了这个命令,但它抛出了错误:
cat temp.txt | awk 'BEGIN {sum=0}; {sum+= system(numfmt --from=iec $0) } END {print sum;}'
答案1
我看不出numfmt
在 awk 中调用有什么好处——为什么不简单地通过管道传输数据呢?通过它?
$ 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
在 awk 中逐行调用,那么你可以在 GNU awk (gawk) 中使用getline
来自协进程
前任。
$ 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
看