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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
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

我想实现的是

  1. 匹配11个独特的模式
  2. 在输入文件中显示第3列的数据。
  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

任何帮助将是非常感激的:)

答案

我想这是你可能想做的,但我不确定,因为我不知道为什么你要匹配所有这些 "PATTR",而它们出现在每一行输入中,而且你提供的预期输出似乎与你提供的样本输入不匹配,你说你想要一个CSV导入Excel,但你的预期输出不包含任何逗号。

$ awk '
    { hdr=hdr sep $NF; vals=vals sep $3; sep="	" }
    !(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=" "sep=",". 如果这不是您所需要的全部,那么请更新您的问题,以提供更多真正具有代表性和一致性的样本输入输出,更好地捕捉您的需求。

以上是关于Awk多模式匹配,并将输入文件的输出格式化为列。的主要内容,如果未能解决你的问题,请参考以下文章

AWK 比较两个文件中的两列输出匹配行 - 匹配中缺少行

shell中最强大,实用的命令awk

AWK:比较 2 个 csv 文件中的 2 列,输出到第三个。如何获得与另一个文件不匹配的输出?

两个文件中的AWK列匹配,打印不同的列

shell脚本之awk工具的使用

AWK