AWK提取多个组从每个线(awk extract multiple groups from each

2019-06-25 16:19发布

当模式在一条线上多次匹配如何执行对所有匹配组的行动?

为了说明这一点,我想搜索/Hello! (\d+)/ /Hello! (\d+)/并使用数字,例如,将它们打印出来或它们求和,所以对于输入

abcHello! 200 300 Hello! Hello! 400z3
ads
Hello! 0

如果我决定要打印出来,我期望的输出

200
400
0

Answer 1:

这是一个简单的语法,每一个的awk(NAWK,mawk,呆子,等等)可以用这个。

{
    while (match($0, /Hello! [0-9]+/)) {
        pattern = substr($0, RSTART, RLENGTH);
        sub(/Hello! /, "", pattern);
        print pattern;
        $0 = substr($0, RSTART + RLENGTH);
    }
}


Answer 2:

这是gawk句法。 这也适用于模式时,有没有这可以作为一个记录分隔符和不匹配了换行符固定文本:

 {
     pattern = "([a-g]+|[h-z]+)"
     while (match($0, pattern, arr))
     {
         val = arr[1]
         print val
         sub(pattern, "")
     }
 }


Answer 3:

GNU AWK

awk 'BEGIN{ RS="Hello! ";}
{
    gsub(/[^0-9].*/,"",$1)
    if ($1 != ""){ 
        print $1 
    }
}' file


Answer 4:

没有GAWK功能多次匹配相同的模式在一条线上。 除非你知道确切的图案多少次重复。

有了这个,你必须遍历“手动”在同一行中的所有比赛。 对于示例输入,这将是:

{
  from = 0
  pos = match( $0, /Hello! ([0-9]+)/, val )
  while( 0 < pos )
  {
    print val[1]
    from += pos + val[0, "length"]
    pos = match( substr( $0, from ), /Hello! ([0-9]+)/, val )
  }
}

如果该模式应换行匹配了过来,必须修改输入记录分隔符 - RS



文章来源: awk extract multiple groups from each line