分析报告文件的Bash脚本

分析报告文件的Bash脚本,bash,reporting,Bash,Reporting,我有以下bash脚本,用于分析当前目录中的所有报告文件: #!/bin/bash # methods analyzeStructuralErrors() { # do something with $1 } # main reportFiles=`find $PWD -name "*_report*.txt"`; for f in $reportFiles do echo "Processing $f" analyzeStructuralErrors $

我有以下bash脚本,用于分析当前目录中的所有报告文件:

#!/bin/bash    


# methods
analyzeStructuralErrors()
{ 
    # do something with $1
}

# main
reportFiles=`find $PWD -name "*_report*.txt"`; 
for f in $reportFiles
do
    echo "Processing $f"
    analyzeStructuralErrors $f
done
我的报告文件的格式如下:

Error Code for Issue X - Description Text - Number of errors.
col1_name,col2_name,col3_name,col4_name,col5_name,col6_name
   1143-1-1411-247-1-72953-1
   1143-2-1411-247-436-72953-1
   2211-1-1888-204-442-22222-1
Error Code for Issue Y - Description Text - Number of errors.
col1_name,col2_name,col3_name,col4_name,col5_name,col6_name
   Other data
   .
   .
   .

我正在寻找一种方法来遍历每个文件并聚合报表数据。在上面的例子中,我们有两个类型为X的独特问题,我想在AnalyzeStructure中处理。在此例程中,可以忽略其他类型的问题。有人能就如何做到这一点提供建议吗?我想阅读每一行,直到基本上遇到下一个错误,然后将数据放入某种数据结构中。

正如Dave Jarvis所建议的,
awk
将:

  • 比bash更好地处理这个问题
  • 这很容易学
  • 可能在bash可用的任何地方都可用
我从来没有看过比这更远的地方


如果对列名列表和数据都使用一致的字段分隔符,事情会变得更容易。也许您可以在馈送到
awk
之前,使用
sed
bash
脚本中进行一些预处理。无论如何,看看手册中的
多维数组
读取多行

Bash有一个由整数索引的一维数组。bash4添加了关联数组。数据结构就是这样。AWK具有一维关联数组,并通过二维数组进行伪造。如果您需要某种更高级的数据结构,例如,您需要使用Python或其他语言

也就是说,这里是如何解析所显示数据的大致轮廓

#!/bin/bash    

# methods
analyzeStructuralErrors()
{ 
    local f=$1
    local Xpat="Error Code for Issue X"
    local notXpat="Error Code for Issue [^X]"
    while read -r line
    do
        if [[ $line =~ $Xpat ]]
        then
            flag=true
        elif [[ $line =~ $notXpat ]]
        then
            flag=false
        elif $flag && [[ $line =~ , ]]
        then
            # columns could be overwritten if there are more than one X section
            IFS=, read -ra columns <<< "$line"
        elif $flag && [[ $line =~ - ]]
        then
            issues+=(line)
        else
            echo "unrecognized data line"
            echo "$line"
        fi
    done

    for issue in ${issues[@]}
    do
        IFS=- read -ra array <<< "$line"
        # do something with ${array[0]}, ${array[1]}, etc.
        # or iterate
        for field in ${array[@]}
        do
            # do something with $field
        done
    done
}

# main
find . -name "*_report*.txt" | while read -r f
do
    echo "Processing $f"
    analyzeStructuralErrors "$f"
done
#/bin/bash
#方法
分析结构错误()
{ 
本地f=1美元
本地Xpat=“问题X的错误代码”
local notXpat=“问题[^X]的错误代码”
而read-r行
做
如果[$line=~$Xpat]]
然后
flag=true
elif[[$line=~$notXpat]]
然后
flag=false
elif$flag&&[$line=~,]]
然后
#如果有多个X节,则可能会覆盖列

IFS=,read-ra columns下面是一个正在工作的awk实现,它使用它的伪多维数组。我已经包含了示例输出,以向您展示它的外观。我冒昧地添加了一个“Count”列,以表示给定错误代码遇到某个“问题”的次数

#!/bin/bash

awk '
 /Error Code for Issue/ {
   errCode[currCode=$5]=$5
 }
 /^ +[0-9-]+$/ {
   split($0, tmpArr, "-")
   error[errCode[currCode],tmpArr[1]]++
 }
 END {
   for (code in errCode) {
     printf("Error Code: %s\n", code)
     for (item in error) {
       split(item, subscr, SUBSEP)
       if (subscr[1] == code) {
         printf("\tIssue: %s\tCount: %s\n", subscr[2], error[item])
       }
     }
   }
 }
' *_report*.txt
输出
我看到一个版本的类型为“X”和一个版本的类型为“Y”,而不是两个版本的类型为“X”。另外,请提供您希望对每个错误类型解析的内容。类型为X的两个版本是1143和2211。@Amir:?旁注:避免“for FILE in
;do”要对文件进行迭代,请选中“find…| while IFS=$”\n“read-r FILE;do”或者类似的。@tokland:除非你能用globbing:
在*
Nice-SiegeX中为文件做这件事!我最后用Java写了一个工具。
$ ./report.awk
Error Code: B
        Issue:    1212  Count: 3
Error Code: X
        Issue:    2211  Count: 1
        Issue:    1143  Count: 2
Error Code: Y
        Issue:    2961  Count: 1
        Issue:    6666  Count: 1
        Issue:    5555  Count: 2
        Issue:    5911  Count: 1
        Issue:    4949  Count: 1
Error Code: Z
        Issue:    2222  Count: 1
        Issue:    1111  Count: 1
        Issue:    2323  Count: 2
        Issue:    3333  Count: 1
        Issue:    1212  Count: 1