我在 macOS 系统上将输入通过管道传输到 awk。我想要两个十进制值的总和。每两行出现一个,另一个出现在每四行。我想要每五行的总和结果。这些值前面用冒号+空格分隔,后面用逗号分隔。每六行是空的。此模式重复直到输入结束。
BB: 728345643856359022,
SH: 3560836,
RJ: 1500369,
DD: 1403849,
Total:,
BB: 729586953244932948,
SH: 8560836,
RJ: 4700360,
DD: 3403021,
Total:,
BB: 821334125345384020,
SH: 5293431,
RJ: 2642499,
DD: 2433292,
Total:,
如果相关,which awk
输出/usr/bin/awk
和brew list --version
输出gawk 5.2.1_1
。这在 g/awk 中可能吗?任何建议表示赞赏!
要格式化我正在使用的输入:
getlist | awk '{print $1 $2}' \
| grep 'BB\|SH\|RJ\|DD' \
| sed 's/"//g' \
| awk '{print;} NR % 4 == 0 { print "Total:,";}' \
| awk '{print;} NR % 5 == 0 { print "";}' \
| awk '{print $1 $2}'
预期产出
BB: 728345643856359022,
SH: 3560836,
RJ: 1500369,
DD: 1403849,
Total: 4964685,
BB: 729586953244932948,
SH: 8560836,
RJ: 4700360,
DD: 3403021,
Total: 11963857,
BB: 821334125345384020,
SH: 5293431,
RJ: 2642499,
DD: 2433292,
Total: 7726723,
首先,让我们稍微简化一下您的管道。我不知道
getlist
会产生什么输出,但根据您展示的内容,这将等同于不添加该行的微小更改,Total
因为这只会使其更难解析,我们将在稍后添加它:您可以在 处换行
|
,不需要\
。并且您可以将所有步骤合并为一个awk
, 并使用tr
instead ofsed
简洁(并且可能速度虽然这里的差异很小)。考虑到这一点,我们可以
awk
稍微扩展一下以获得剩余的部分:请注意,我添加
,
到要删除的字符中tr
以方便数字运算(,
不是数字),因此我还将它添加回print
awk 的各种调用中。万一我误解了,这里有一种方法可以使用原始管道中已有的输出来做同样的事情(我将您的示例保存为
file
):任何时候你的数据中有标签值对,我发现最好先创建这些映射的数组(
m[]
如下),然后你可以通过使用关联名称索引数组来获取任何值。使用任何 awk:这是一种方法,它采用您现有的输出并获得新的所需输出。此处适用于 gawk 5.1.0。