Awk多模式匹配并将输出格式化为输入文件中的列

Awk多模式匹配并将输出格式化为输入文件中的列,awk,Awk,我在一个文件中收集11个进程的统计数据,以及每个进程每5分钟使用多少内存 我正在尝试使用awk进行多模式匹配,然后将输出格式化到另一个文件中,以便将其导入excel以生成趋势分析 每行有11种独特的图案,例如,当前格式如下: 06/09/20 13:30:00 240.73 MB PATTR1 06/09/20 13:30:00 66.28 MB PATTR2 06/09/20 13:30:00 25.26 MB PATTR3 06/09/20 13:30:00 25.12 MB PATTR4

我在一个文件中收集11个进程的统计数据,以及每个进程每5分钟使用多少内存

我正在尝试使用awk进行多模式匹配,然后将输出格式化到另一个文件中,以便将其导入excel以生成趋势分析

每行有11种独特的图案,例如,当前格式如下:

06/09/20 13:30:00 240.73 MB PATTR1
06/09/20 13:30:00 66.28 MB PATTR2
06/09/20 13:30:00 25.26 MB PATTR3
06/09/20 13:30:00 25.12 MB PATTR4
06/09/20 13:30:00 18.43 MB PATTR5
06/09/20 13:30:00 15.82 MB PATTR6
06/09/20 13:30:00 7.69 MB PATTR7
06/09/20 13:30:00 7.34 MB PATTR8
06/09/20 13:30:00 6.08 MB PATTR9
06/09/20 13:30:00 3.86 MB PATTR10
06/09/20 13:30:00 3.84 MB PATTR11
06/09/20 13:35:01 240.88 MB PATTR1
06/09/20 13:35:01 73.31 MB PATTR2
06/09/20 13:35:01 25.26 MB PATTR3
06/09/20 13:35:01 25.12 MB PATTR4
06/09/20 13:35:01 18.43 MB PATTR5
06/09/20 13:35:01 15.82 MB PATTR6
06/09/20 13:35:01 7.69 MB PATTR7
06/09/20 13:35:01 7.34 MB PATTR8
06/09/20 13:35:01 6.08 MB PATTR9
06/09/20 13:35:01 3.86 MB PATTR10
06/09/20 13:35:01 3.84 MB PATTR11
我可以使用awk匹配所有模式,但不确定如何编码awk以获得所需的输出

awk '/PATTR1/ || /PATTR2/ || /PATTR3/ || /PATTR4/ || /PATTR5/ || /etc../' inputfile
我想要实现的是:

  • 匹配11种独特的图案
  • 显示输入文件第3列中的数据
  • 将输出格式化为11列,每列标有相应的模式
  • 所需输出:

    PATTR1  PATTR2  PATTR3  PATTR4  PATTR5  PATTR6  PATTR7  PATTR8  PATTR9  PATTR10 PATTR11
    66.28   240.73  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    73.31   240.88  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    80.31   240.96  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    87.24   241.07  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    94.05   241.19  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    100.85  241.31  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    108     241.44  25.12   25.26   18.43   15.82   7.69    7.34    3.86    3.84    6.08
    

    任何帮助都将不胜感激:)

    我想这就是你可能想要做的,但我不确定,因为idk为什么你要尝试匹配所有这些“PATTR”当它们出现在每一行输入中时,您提供的预期输出似乎与您提供的示例输入不匹配,并且您说希望将CSV导入Excel,但预期输出不包含任何逗号:

    $ awk '
        { hdr=hdr sep $NF; vals=vals sep $3; sep="\t" }
        !(NR%11) { if (NR==11) print hdr; print vals; hdr=vals=sep="" }
    ' file
    PATTR1  PATTR2  PATTR3  PATTR4  PATTR5  PATTR6  PATTR7  PATTR8  PATTR9  PATTR10 PATTR11
    240.73  66.28   25.26   25.12   18.43   15.82   7.69    7.34    6.08    3.86    3.84
    240.88  73.31   25.26   25.12   18.43   15.82   7.69    7.34    6.08    3.86    3.84
    

    如果您确实想要CSV而不是TSV,则只需将
    sep=“\t”
    更改为
    sep=“,”
    。如果这还不是您所需要的全部,那么请更新您的问题,以提供更具真实代表性和一致性的样本输入/输出,从而更好地捕获您的需求。

    为什么需要匹配模式,最后一列中是否有其他您想要避免的字符串?这些模式是否总是按照您的示例输入进行排序?这些是金门提取过程,将每5分钟使用的驻留集大小内存量输出到一个文件中,查询/proc/$pid/map文件。输出是有序的/线性的,所需的输出将允许我从csv文件直接导入excel,以创建一个随时间增长的图表。哇@Ed。我花了很多时间才了解这里发生了什么。@DigvijayS真的吗?它的任何特定部分比其他部分更难理解?为什么在这里重置值
    hdr=vals=sep=“”
    如果hdr和vals没有被重置,那么它们只会在整个文件中不断增长,而不是在每11行打印一次后被清除。如果sep不是,那么第一个块之后的每一行都将以一个制表符开始。尝试删除该语句(或只是其中的一部分),您将看到发生了什么。谢谢您,Ed,这非常有效!正在尝试理解您的代码:)