使用AWK从文件中解析数字

时间:2017-10-02 18:29:46

标签: string parsing awk scripting

我有一个包含windows“systeminfo”信息的文件。该文件如下所示:

Virtual Memory: Available: 13,160 MB
Virtual Memory: In Use:    3,143 MB
Virtual Memory: Available: 13,161 MB
Virtual Memory: In Use:    3,142 MB
Virtual Memory: Available: 13,162 MB
Virtual Memory: In Use:    3,141 MB

我想只解析数字并存储在csv文件中。 所以一个csv文件将命名为“available.csv”并包含

13,160;13,161;13,162.

另一个名为“in_use.csv”的csv文件将包含3,143;3,142,3,141

我知道我可以使用: grep -r "Available" > available.csv然后只提取数字。

如何使用awk完成此操作?

由于

2 个答案:

答案 0 :(得分:1)

Awk 解决方案:

awk '/Available/{ printf "%s%s",(!a)?"":";",$4 > "available.csv"; a++ }
     /In Use/{ printf "%s%s",(!b)?"":";",$5 > "in_use.csv"; b++ }' input

答案 1 :(得分:0)

GNU awk 解决方案。就文件名而言,更一般的方法是:

$ cat tst.awk
BEGIN{FS=": +"}
{ split($3,a," ")                              # remove the MB from number
  gsub(/ /,"_",$2)                             # replace space by "_"
  f=tolower($2) ".csv"                         # construct filename
  printf "%s%s", (file[f]++?";":""), a[1] > f  # output number to file
}
END { for (f in file) close(f) }               # close all opened files

用于复制和粘贴:

$ awk 'BEGIN{FS=": +"} \
       { split($3,a," ");gsub(/ /,"_",$2);f=tolower($2) ".csv"; \
         printf "%s%s", (file[f]++?";":""), a[1] > f} \
       END { for (f in file) close(f) }' input.txt