【问题标题】:Analyze a control table by Shell Script通过 Shell Script 分析控制表
【发布时间】:2015-03-01 17:07:06
【问题描述】:

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

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

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

干杯,
塔里克

【问题讨论】:

  • 在我看来,一个潜在的解决方案是通过它们各自的标题行来确定列。如果端口号的列标题例如从第 30 列到第 40 列,则脚本在第 30 到 40 列中查找以获取端口号。里面的东西:好的,用作端口号。没有找到/空:跳过。但是,考虑到我的 Shell 技能,我担心这种努力 :-) 潜在的副作用当然是,标题必须始终消耗与值相同或更多的空间/行,但这可以管理。
  • 您能否添加有关输入数据的更多详细信息?值是否可能超过标题定义的列,写入下一列?值也可以有空格吗?每列的可能值是否可确定(例如,“PortNumber”列始终为[0-9],“ControlValue_1/2”列的已知字符串集)。请更新您的问题。我还建议更新标题以反映您的要求,例如“解析缺少值的空格分隔值”

标签: bash shell awk cut


【解决方案1】:

你没有说你想要的输出是什么,但这向你展示了正确的方法:

$ 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]”并将每个字段左对齐美化一下。

【讨论】:

  • 艾德,非常感谢!这是我的想法,它肯定会做! :-))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多