首页 > 解决方案 > 如何使用 awk 格式化程序的输出,转换第一列但保持其余部分不变?

问题描述

我需要格式化的输出,go tool cover以便我可以拆分第一列,/所以我只得到最后两个值,但将其余输出保留为原始值。

以下是原始输出的样子:

$ go tool cover -func=coverage.out
github.com/company/utils/common.go:6:              IsFoo                   100.0%
github.com/company/utils/logger.go:118:            maskFoo                 100.0%
github.com/company/utils/logger.go:127:            createFoo               100.0%
github.com/company/utils/logger.go:132:            CreateFakeFoo           100.0%
github.com/company/utils/foo_validaiton.go:43:     IsFoo                   100.0%
github.com/company/utils/foo_validaiton.go:49:     GreaterThanFoo          100.0%
github.com/company/utils/yaml.go:39:               closeFOO                100.0%
total:                                             (statements)            100.0%

我尝试使用 awk 拆分第一列并仅获取utils/file.go部分,但列未对齐。

$ go tool cover -func=coverage.out | awk '{split($1, a, "/"); print a[4]"/"a[5]"\t"$2"\t"$3}'

utils/common.go:6:  IsFoo  100.0%
utils/logger.go:118:  maskFoo  100.0%
utils/logger.go:127:  createFoo  100.0%
utils/logger.go:132:  CreateFakeFoo  100.0%
utils/foo_validaiton.go:43:  IsFoo  100.0%
utils/foo_validaiton.go:49:  GreaterThanFoo  100.0%
utils/yaml.go:39:  closeFOO  100.0%
/  (statements)  100.0%

如何使用 awk 或其他 cli 工具归档以下输出?

utils/common.go:6:              IsFoo                   100.0%
utils/logger.go:118:            maskFoo                 100.0%
utils/logger.go:127:            createFoo               100.0%
utils/logger.go:132:            CreateFakeFoo           100.0%
utils/foo_validaiton.go:43:     IsFoo                   100.0%
utils/foo_validaiton.go:49:     GreaterThanFoo          100.0%
utils/yaml.go:39:               closeFOO                100.0%
total:                          (statements)            100.0%

标签: awk

解决方案


如果您想将最后 2 个值与/第一列分开,您可以使用模式在最后一次出现正斜杠之前和之后匹配 1 个或多个字符,然后再次将该匹配设置为第 1 列的值。

从输入加载示例数据file

awk 'match($1, /[^\/]+\/[^\/]+$/) {
  $1 = substr($1, RSTART, RLENGTH)
}1' file | column -t

输出

utils/common.go:6:           IsFoo           100.0%
utils/logger.go:118:         maskFoo         100.0%
utils/logger.go:127:         createFoo       100.0%
utils/logger.go:132:         CreateFakeFoo   100.0%
utils/foo_validaiton.go:43:  IsFoo           100.0%
utils/foo_validaiton.go:49:  GreaterThanFoo  100.0%
utils/yaml.go:39:            closeFOO        100.0%
total:                       (statements)    100.0%

命令将是:

go tool cover -func=coverage.out | awk 'match($1, /[^\/]+\/[^\/]+$/){$1=substr($1,RSTART,RLENGTH)}1' | column -t

如果您想让模式更具体,请以冒号之间的数字结尾:118:,例如:

/[^\/]+\/[^\/]+:[0-9]+:$/

推荐阅读