Shell 特定字段上出现次数的格式化输出

Shell 特定字段上出现次数的格式化输出,shell,unix,awk,Shell,Unix,Awk,如何将输出格式化为所需格式,如下所示: SUBPATH DANAME DMNAME GROUP STATE cciss/c0d0 cciss/c0d0 - - ENABLED sda xiv0_001b emc000 gicn

如何将输出格式化为所需格式,如下所示:

SUBPATH                     DANAME               DMNAME       GROUP        STATE
cciss/c0d0                  cciss/c0d0           -            -            ENABLED
sda                         xiv0_001b            emc000       gicn2db_PRD  ENABLED
sdb                         xiv0_001b            emc000       gicn2db_PRD  ENABLED
sdd                         xiv0_001b            emc000       gicn2db_PRD  ENABLED
sdc                         xiv0_001b            emc000       gicn2db_PRD  ENABLED
sdx                         xiv0_004f            0000         ddrr2db_PRD  ENABLED
sdad                        xiv0_004f            0000         ddrr2db_PRD  DISABLED
sdaa                        xiv0_004f            0000         ddrr2db_PRD  ENABLED
sdu                         xiv0_004f            0000         ddrr2db_PRD  ENABLED
sdaj                        xiv0_005d            0001         gconfdb_PRD  DISABLED
sdag                        xiv0_005d            0001         gconfdb_PRD  ENABLED
sdah                        xiv0_005d            0001         gconfdb_PRD  ENABLED
...
例如,我需要解析此块并创建如下输出:

xiv0_001b has <total_amount> of ENABLED paths and <total_amount> of DISABLED paths.
...
xiv0\u 001b具有一组启用路径和一组禁用路径。
...
因为每个名称重复了几次(状态和磁盘名…)

最好使用
awk
以避免使用
grep
等进行多个分区。

以下是一种方法:

$ awk 'NR>1{$5=="ENABLED"?e[$2]++:d[$2]++}END{for(i in e)printf "%s ENABLED %d DISABLED %d\n",i,e[i],d[i]}' file
xiv0_005d ENABLED 2 DISABLED 1
xiv0_004f ENABLED 3 DISABLED 1
cciss/c0d0 ENABLED 1 DISABLED 0
xiv0_001b ENABLED 4 DISABLED 0

根据需要修改
printf
格式

不错。添加所有禁用的磁盘部分将是完美的。e、 g.
$2
不在
e
中,仅在
d
@Kent yes中。如果OP需要,此逻辑可以在
结束
块中轻松实现。