通过Shell脚本分析控制表

时间:2015-01-03 18:04:21

标签: bash shell awk cut

shell脚本正在分析控制表以获取正确的参数以进行处理。 目前,它很简单 - 使用grep,它指向正确的行,awk {print $ n}确定正确的列。
列仅由空格分隔。没有特殊规则,只是由空格分隔的值。 一切都很好,工作正常,用户喜欢它 只要没有列留空。对于最后一个列,可以将其留空,但如果某人没有在中间填充一列,则会混淆awk {print $ n}逻辑。 当然,可以作为用户填写每个条目,或者可以将列分隔符定义为“;” 。 如果跳过某些内容,可以使用“;;”但是,我宁愿不更改表格样式 所以问题是:
如何有效地分析具有colum值空白的表?表是这样的:

ApplikationService    ServerName    PortNumber     ControlValue_1    ControlValue_2    
Read                  chavez.com       3599         john                 doe    
Write                                  3345         johnny               walker    
Update                curiosity.org                 jerry                 

可能会有什么帮助: 如果列中设置了值,则在其列标题描述下(更不精确)。

干杯,
拉茶

1 个答案:

答案 0 :(得分:2)

你不能说出你想要的输出是什么,但这显示了你正确的方法:

$ cat tst.awk
NR==1 {
    print
    while ( match($0,/[^[:space:]]+[[:space:]]*/) ) {
        width[++i] = RLENGTH
        $0 = substr($0,RSTART+RLENGTH)
    }
    next
}
{
    i = 0
    while ( (fld = substr($0,1,width[++i])) != "" ) {
        gsub(/^ +| +$/,"",fld)
        printf "%-*s", width[i], (fld == "" ? "[empty]" : fld)
        $0 = substr($0,width[i]+1)
    }
    print ""
}
$
$ awk -f tst.awk file
ApplikationService    ServerName    PortNumber     ControlValue_1    ControlValue_2
Read                  chavez.com    3599           john              doe
Write                 [empty]       3345           johnny            walker
Update                curiosity.org [empty]        jerry             [empty]

它使用标题行中每个字段的宽度来确定文件每一行中每个字段的宽度,然后用字符串" [empty]"替换空字段。并且左对齐每个字段只是为了相当一点。