【发布时间】:2017-03-26 22:49:17
【问题描述】:
我有以下几点:
echo AS:i:0 UQ:i:0 ZZ:Z:mus.sup NM:i:0 MD:Z:50 ZZ:Z:cas.sup CO:Z:endOfLine|awk '{match($0,/ZZ:Z[^ ]*/,m); print m[0], m[1]}'
不幸的是,它只输出第一个条目(两个中的):
ZZ:Z:mus.sup
在我看来,match() 函数无法将多个匹配项存储到其数组中。除非我在这里遗漏了什么……?
如果确实如此,有人会建议一个基于 awk 的“匹配”替代方案,该替代方案将允许获得两个 ZZ:Z 条目。请注意,这些不是每次都位于同一列(!) - 因此需要使用 match() 函数。
这里的总体思路是在同一个 awk 命令中获取一些出现在已知列位置的值(例如 col1、col2),以及一些位于未知列的值(根据它们的唯一签名“ZZ:Z”获取)索引列。
此外,以下尝试 - 使用 gensub() 也无法输出/打印两个 ZZ:Z 条目,并且仅识别两个条目中的一个(以及另一个在弃用倒数时..)
echo AS:i:0 UQ:i:0 ZZ:Z:mus.sup NM:i:0 MD:Z:50 ZZ:Z:cas.sup CO:Z:endOfLine|awk '{val= gensub(/.*(ZZ:Z[^ ]*).*/,"\\1 \\2","g",$0);print val}'
这种情况下的结果是:
ZZ:Z:cas.sup
但我想得到这样的结果:
ZZ:Z:mus.sup ZZ:Z:cas.sup
【问题讨论】: