如何将命令应用到管道输出的每一行并添加所有这些数字?

如何将命令应用到管道输出的每一行并添加所有这些数字?

我有一个命令,可以在多行中输出以下文件大小:

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

相关内容