过滤文本文件并输出到csv

时间:2014-07-31 11:53:31

标签: unix filter filtering

我正在使用Solaris SunOS 5.10。我有一个目录,我已经填充了许多文本文件。像这样:

CMGW9.log
CMGW11.log
CMGW2.log
.
.
CMGWx.log

我只使用以下方法过滤文件中的有趣部分:

cat CMGW9.log | nawk '/productNumber|productRevision/'

我得到的输出是:

productNumber                        GMPV4_CNP_R6.3.2.0D
productRevision                      R6A

现在需求是一个csv文件,如下所示:

|MGW_Name|   Product Number   |Product Revision|
------------------------------------------------

 CMGW9   GMPV4_CNP_R6.3.2.0D|  R6A           
 CMGW11   xxxxxxxxxxxxxxxxxxx  R6A
 CMGW2    xxxxxxxxxxxxxxxxxxx  R6A
 .   .  .   .   .   .    .   .  .
 CMGWx    xxxxxxxxxxxxxxxxxxx  xx

请帮忙。感谢。

2 个答案:

答案 0 :(得分:1)

这里有一个可能的解决方案的一部分;

$ cat getloginfo.sh 
#!/bin/bash
for file in CMGW*.log
do
  filename=${file%.log}
  pn=`awk '$0 ~ /productNumber/  {print $2}' $file`
  pr=`awk '$0 ~ /productRevision/  {print $2}' $file`
  echo -e "$filename\t$pn\t$pr" >> CMGWresume.log
done
$ ./getloginfo.sh 
$ cat CMGWresume.log 
CMGW11  GMPV5.3.2.0D    R6AB
CMGW9   GMPV4_CNP_R6.3.2.0D R6A

答案 1 :(得分:1)

试试这个。它会生成一个CSV文件。

awk -v OFS=, 'FNR == 1 { key = FILENAME; sub(/[.][^.]*$/, "", key); keys[++k] = key }
    /productNumber|productRevision/ { a[key, $1] = $2 }
    END {
        for (i = 1; i <= k; ++i) {
            key = keys[i]
            print key, a[key, "productNumber"], a[key, "productRevision"]
        }
    }' *.log

这可能会产生你提出的表格:

awk -v OFS="\t" 'FNR == 1 { key = FILENAME; sub(/[.][^.]*$/, "", key); keys[++k] = key }
    /productNumber|productRevision/ { a[key, $1] = $2 }
    END {
        print "|MGW_Name|", "Product Number", "|Product Revision|"
        print "------------------------------------------------"
        print
        for (i = 1; i <= k; ++i) {
            key = keys[i]
            print key, a[key, "productNumber"], a[key, "productRevision"]
        }
    }' *.log

您可以使用printf代替print来更改格式。