如何使用awk在行组中添加缺少的行

时间:2018-10-09 08:55:15

标签: awk

大家好,对于这个简单的问题,抱歉,我有一个列表,列出了我要提取数据的带有PC规格的文本文件。使用:

awk '/Disk\:/ && !/USB/ ||FNR==1 {c++;if(FNR==1)c=0;print c " " $0}'  *.txt > file

我可以按以下方式提取每个系统的磁盘数量和型号

0 SYSTEM
1 Disk: ATA WDC WD5000AAKX-0 SCSI Disk Device (465,8 GB)
0 SYSTEM
1 Disk: ST3160815AS (149,0 GB)
0 SYSTEM
1 Disk: WDC WD5003AZEX-00MK2A0 (465,8 GB)
2 Disk: WDC WD5003AZEX-00MK2A0 (465,8 GB)
3 Disk: WDC WD40EFRX-68WT0N0 (3,6 TB)

每个系统最多可以有四个磁盘,而我想做的是添加缺少的行,以便将来将文件转换为CSV。所需的输出如下:

0 SYSTEM
1 Disk: ATA WDC WD5000AAKX-0 SCSI Disk Device (465,8 GB)
2 Disk: NO DISK
3 Disk: NO DISK
4 Disk: NO DISK
0 SYSTEM
1 Disk: ST3160815AS (149,0 GB)
2 Disk: NO DISK
3 Disk: NO DISK
4 Disk: NO DISK
0 SYSTEM
1 Disk: WDC WD5003AZEX-00MK2A0 (465,8 GB)
2 Disk: WDC WD5003AZEX-00MK2A0 (465,8 GB)
3 Disk: WDC WD40EFRX-68WT0N0 (3,6 TB)
4 Disk: NO DISK

我在论坛上进行了搜索,找到了两个示例,它们都添加了缺失行和按n分组的行,但是还没有设法将两者合并。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是对原始脚本的更新。只需少量更新即可保持相同的逻辑。

awk '(NR!=1) && (FNR==1) { for(c++;c<=4;++c) { print c" Disk: NODISK" }}
     (FNR==1) { c=0; print c,$0 }
     /Disk\:/ && !/USB/ { print ++c,$0 }
     END{ for(c++;c<=4;++c) { print c" Disk: NODISK" }}' *txt
  • 第一行:如果我们输入一个新文件而不是第一个文件,则打印丢失的磁盘
  • 第二行:如果我们输入一个新文件,请设置c=0并打印该行(打印0 SYSTEM
  • 最后一行是:如果该行包含单词DISK但不包含单词USB,则递增c并打印该行。
  • 完成后,为最后一个文件打印丢失的磁盘