AWK 在浮动定界符之后获取字符串

AWK get strings after floating delimiters

我需要验证像这样乱序打印变量的脚本的输出。

proc:123 id:456 zzz:aaa xxx:ccc

xxx: ccc id: 654 proc: 321 zzz: aaa yyy:111

...

我需要获取“proc”值和“id”,但随着位置的变化,我不知道如何使用 awk 来完成。 如果字段像这样保持相同的位置

proc:123 id:456 zzz:aaa xxx:ccc

这样就可以了

awk '$2 == "123" && $4 != "456" {print "something"}'

但是由于字段是动态的,我有点卡住了

谢谢

$ awk '{
    for(i=1;i<NF;i++)                         # iterate all awk default-separated fields
        if($i~/^(proc|id):$/)                 # looking for proc: and id:
            a[$i]=$(i+1)                      # get value to an indexed array element
    if(a["proc:"]=="123"&&a["id:"]=="456") {  # once you got both
        print                                 # print
        delete a                              # delete a for next round
    }
}' file 

输出:

proc: 123 id: 456 zzz: aaa xxx: ccc

如果数据实际上是:proc:123 id:456 ....

,则失败

一旦您使用此代码隔离出字段值,您就可以对其执行任何形式的过滤逻辑。它甚至可以处理字段值中的 multi-byte unicode 数据。

{m,g}awk '
BEGIN {                              
     _ =  index(FS="[ \t:]+", OFS)              
    __ = """(proc|id)[ \t]*[:][ \t]*[^ \t]+" 
}  NF  *              ( \                                                                    
 $!NF  = sprintf("%.0s%.0s row: %5.f | proc: %6s | id: %6s | orig [=10=]:\f %s", ___=$+__,   
   NF *=         gsub(__,"& ")* gsub("(^|)[^]*(|$)","")*\  
                 gsub( "^" FS "|" FS "$",        "")^!_, 
   NR,           $(_^(/^i/)*_), $(_^(/^p/)*_), ___))^!_'

————————————————————————————————

 row:     1 | proc:    123 | id:    456 | orig [=11=]:
                                                   proc: 123 id: 456 zzz: aaa xxx: ccc
 row:     3 | proc:    321 | id:    654 | orig [=11=]:
                                                   xxx: ccc id: 654 proc: 321 zzz: aaa yyy:111
 
 row:     4 | proc: 123뀿abc | id: 456_987 | orig [=11=]:
                                                       proc: 123뀿abc id: 456_987 zzz: aaa xxx: ccc